react-router v6

文章简介

本文主要介绍:

新版本路由和老版本的差异,使用区别,API 区别。
新版本路由组件 Router ,Routes ,和 Route 的原理。
Outlet 组件原理。
useRoutes 原理。

目录

一,react路由6和路由5的差异

1 路由5中的Switch与路由6中的Routes

2 嵌套路由的升级

3 路由状态和页面跳转

状态获取

路由跳转

动态路由

url参数信息获取

官方文档

二 原理分析

1 新版 Route 设计

2 外层容器,更新源泉 BrowserRouter | HashRouter | Router

老版本的 BrowserRouter

新版本的 BrowserRouter

新版本 Router

3 原理深入,Routes 和 branch 概念

Routes 和 useRoutes

useRoute

路由状态传递

三 v5 和 v6 区别总结

组件层面上:

使用层面上:

原理层面上:



一,react路由6和路由5的差异

 

1 路由5中的Switch与路由6中的Routes

新版本的 router 没有 Switch 组件,取而代之的是 Routes ,但是在功能上 Routes 是核心的,起到了不可或缺的作用。老版本的 route 可以独立使用,新版本的 route 必须配合 Routes 使用。

在新版的 router 中,已经没有匹配唯一路由的 Switch 组件,取而代之的是 Routes 组件,但是我们不能把 Routes 作为 Switch 的代替品。

因为在新的架构中 ,Routes 充当了很重要的角色,在 react-router路由原理 文章中,曾介绍到 Switch 可以根据当前的路由 path ,匹配唯一的 Route 组件加以渲染。

但是 Switch 本身是可以被丢弃不用的,但是在新版的路由中, Routes 充当了举足轻重的作用。

比如在 v5 中可以不用 Switch 直接用 Route,但是在 v6 中使用 Route ,外层必须加上 Routes 组件,也就是 Routes -> Route 的组合。

如果 Route 外层没有 Routes ,会报出错误。

2 嵌套路由的升级

新版本路由引入 Outlet 占位功能,可以更方便的配置路由结构,不需要像老版本路由那样,子路由配置在具体的业务组件中,这样更加清晰,灵活。

对于新版本的路由,嵌套路由结构会更加清晰.

比如在老版本的路由中,配置二级路由,需要在业务组件中配置,我们需要在 Children 组件中进行二级路由的配置。

但是在 路由6 中,对于配置子路由进行了提升,可以在子路由直接写在 父组件里。

Container 内部运用了 v6 Router 中的 Outlet 。

而 Outlet 才是真正渲染子路由的地方。

这里的 Outlet 更像是一张身份卡,证明了这个就是真正的路由组件要挂载的地方,而且不受到组件层级的影响。

这种方式更加清晰,灵活,能够把组件渲染到子组件树的任何节点上。

3 路由状态和页面跳转

状态获取

对于路由状态 location 的获取 ,可以用自定义 hooks 中 useLocation 。location 里面保存了 hash | key | pathname | search | state 等状态。

路由跳转

新版路由提供了 useNavigate ,实现路由的跳转。

动态路由

新版路由里面实现动态路由,也变得很灵活,可以通过 useParams 来获取 url 上的动态路由信息。比如如下

url参数信息获取

新版路由提供 useSearchParams 可以获取 | 设置 url 参数

官方文档

v6 还提供了一些其他功能的 hooks ,这里就不一一讲了,有兴趣的同学可以看一下官方文档,

Docs Home v6.3.0 | React Router

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Router v6中,可以使用路由表进行动态路由。根据你提供的描述,我可以给出以下方法实现根据权限动态加载路由表: 1. 首先,你需要定义一个路由表,包含了你的权限和对应的组件。例如: ```jsx const routes = [ { path: "/dashboard", permission: "admin", component: AdminDashboard, }, { path: "/dashboard", permission: "user", component: UserDashboard, }, // 其他路由... ]; ``` 这个路由表包含了不同权限对应的路径和组件。 2. 接下来,在你的应用中使用`Routes`组件来渲染路由表。例如: ```jsx import { Routes, Route } from "react-router-dom"; const App = () => ( <Routes> {routes.map((route, index) => ( <Route key={index} path={route.path} element={<route.component />} caseSensitive={false} /> ))} </Routes> ); ``` 这里使用了`Routes`组件来渲染路由表中的每一个路由项。通过`map`函数遍历路由表,在每个路由项上使用`Route`组件进行渲染。 3. 最后,在你需要根据权限动态加载路由表的地方,根据用户的权限动态筛选路由表并渲染相应的路由。例如: ```jsx import { useRoutes } from "react-router-dom"; const App = () => { const filteredRoutes = routes.filter( (route) => route.permission === userPermission ); const element = useRoutes(filteredRoutes); return element; }; ``` 这里使用`useRoutes`钩子函数来根据筛选后的路由表渲染路由。根据用户的权限,将筛选后的路由表传入`useRoutes`函数,返回对应的路由元素。 通过以上的方法,你可以根据权限动态加载路由表,并实现你所需的功能。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值