react-router-dom V6

文章介绍了ReactRouterV6中路由配置的变化,如移除<Redirect/>和<Switch/>,使用<Navigate/>进行重定向,以及路由参数的传递方法,包括问号传参、路径传参和隐式传参。同时,提到了useNavigate、useLocation、useSearchParams和useParams等Hooks在获取参数中的作用。
摘要由CSDN通过智能技术生成

  • 相较于V5版本,移除了<Redirect/>和<Switch/>
  • 所有的路由规则的匹配放在<Routes/>中,单条路由的匹配放在<Route/>中
  • 路由匹配成功后不再基于component/render控制渲染的组件,而是基于element,语法格式是<Component/>
  • 默认就是一个路由匹配成功,就不再匹配下面的了(不再需要<Switch/>)
  • 默认每一项都是精准匹配(不再需要exact)
  • 如果要实现重定向,需要使用组件<Navigate/>,遇到就实现跳转,跳转到to指定的地址,给<Navigate/>设置replace 属性,则不会新增立即记录,而是替换现有记录
	<Navigate replace={true} to="/a/a1" />
  • 如果以上都不匹配,用星号
            <Routes>
                <Route path="/" element={<Navigate to="/a" />} />
                <Route path="/a" element={<A />}>
{/* v6版本中,要求所有的路由(二级或者多级路由),不在分散到各个组件中编写,而是统一都写在一起进行处理!! */}
                    <Route path="/a" element={<Navigate to="/a/a1" />} />
                    <Route path="/a/a1" element={<A1 />} />
                    <Route path="/a/a2" element={<A2 />} />
                    <Route path="/a/a3" element={<A3 />} />
                </Route>
                <Route path="/b" element={<B />} />
                <Route path="/c/:id?/:name?" element={<C />} />
{/* 如果以上都不匹配,我们可以渲染404组件,也可以重定向到A组件「传递不同的问号参数信息」 */}
                <Route path="*" element={<Navigate to={{
                    pathname: '/a',
                    search: '?from=404'
                }} />} />
            </Routes>

加上index就是默认渲染的组件,但是index属性有很多弊端,如果有子路由不能设置这个属性,也不能给子路由设置这个属性,因此尽量少用,用重定向方式

<Route index path="/a" element={<A />}>

V6中所有的路由规则都写在一起,不用分散到各个组件中编写,统一写在一起进行处理,二级路由写在一级路由的标签内部

  {/* Outlet:路由容器,用来渲染二级(多级)路由匹配的内容 */}
  <Outlet />

<Outlet />嵌套路由,可以保证子路由共享父路由的界面而不会覆盖。为此React提供了Outlet组件,将其用于父组件中可以为子路由的元素占位,并最终渲染子路由的元素。

  • V6中<HashRouter/>包裹的组件,即使是基于<Route/>渲染的,也无法通过props获取history,location,match等属性,想获取相关信息只能通过Hooks
  • 没有用<HashRouter/>包裹的组件,不能使用Hooks,<HashRouter/>包裹的组件,不管是不是基于<Route/>渲染的,都可以通过Hooks获取相关信息

V6中实现路由跳转的方式

  • 点击跳转<Link>和<NavLink>
	<Link to="/a/a1">A1</Link>
  • 组件遇到就跳转路由
	<Navigate to="/a" />
  • 编程式导航

V6中取消了history对象,基于navigate函数实现路由跳转
类组件需要使用高阶组件包裹,手动实现withRoute函数

	 import { useNavigate } from 'react-router-dom';
     const navigate = useNavigate();
     navigate('/c');
     navigate('/c', { replace: true });
     navigate({
        pathname: '/c'
     });
     navigate({
        pathname: '/c',
        search: '?id=100&name=zhufeng'
     });

路由跳转过程中的传参方案

  • 问号传参

问号传参会在路径中,刷新时信息不会丢失

	import qs from 'qs';
	navigate({
	            pathname:'/c',
	            search:qs.stringfy({
	                id:100,
	                name:'zhufeng'
	            })
	        })

  • 路径传参
 	navigate(`/c/100/zhufeng`); 
  • 隐式传参

通过state完成

	navigate('/c', {
	            //历史记录池替换现有地址
	            replace: true,
	            //隐式传参信息
	            state: {
	                id: 100,
	                name: 'zhufeng'
	            }
	        });

获取传递的参数

常用的Hooks

  • useLocation 「5中也有」:获取location对象信息 pathname/search/state….
  • useSearchParams「新增的」:获取问号传参信息,取到的结果是一个URLSearchParams对象
  • useParams「5中也有」:获取路径参数匹配的信息
	//获取问号传参信息
    const location = useLocation();
    // location.search:"?id=100&name=zhufeng"
    const usp = new URLSearchParams(location.search);
    console.log(usp.get('id'), usp.get('name')); 
    //获取问号传参信息
	//useSearchParams返回结果是一个数组
    //数组第一项是URLParamsSearch对象 第二个参数是修改的方法
    let [usp] = useSearchParams();
    console.log(usp.get('id'), usp.get('name'));
    */
	//获取路径参数信息
    const params = useParams();
    console.log(params); //=>{id:100,name:'zhufeng'} */
    //获取隐式传参信息
    const location = useLocation();
    console.log(location.state);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
React中使用react-router-dom v6进行跳转的方法如下: 1. 首先,确保你已经安装了react-router-dom v6。你可以使用以下命令进行安装: ```shell npm install react-router-dom@next ``` 2. 在你的组件中引入所需的API: ```javascript import { BrowserRouter as Router, Routes, Route, Link, Navigate } from 'react-router-dom'; ``` 3. 在你的组件中使用`Router`组件包裹你的路由: ```javascript export default function App() { return ( <div className="app"> <Router> {/* 在这里定义你的路由 */} </Router> </div> ); } ``` 4. 使用`Routes`组件定义你的路由规则,并使用`Route`组件定义每个具体的路由: ```javascript export default function App() { return ( <div className="app"> <Router> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> {/* 其他路由规则 */} </Routes> </Router> </div> ); } ``` 5. 在需要进行跳转的地方,使用`Link`组件或`Navigate`组件进行跳转: - 使用`Link`组件: ```javascript import { Link } from 'react-router-dom'; function Home() { return ( <div> <h1>Home</h1> <Link to="/about">Go to About</Link> </div> ); } ``` - 使用`Navigate`组件: ```javascript import { Navigate } from 'react-router-dom'; function Home() { return ( <div> <h1>Home</h1> <button onClick={() => <Navigate to="/about" />}>Go to About</button> </div> ); } ``` 请注意,以上是react-router-dom v6的用法,与v5有一些不同。在v6中,`<Switch>`组件被替换为`<Routes>`组件,`<Redirect>`组件被替换为`<Navigate>`组件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值