0


React Router v6中的更新

标题react-router v6 中的更新

React Router 是一个基于 React 之上的强大路由库,它可以让你向应用中快速地添加视图和数据流,同时保持页面与 URL 间的同步

  1. import { BrowserRouter as Router, Routes, Route, Outlet } from 'react-router-dom';

1.Switch 重命名为 Routes

​ Routes 是以前Switch组件的升级版,它包括相对路由和链接、自动路由排名、嵌套路由和布局等功能

2.Route新特性

​ 负责渲染React组件的UI,其中的path属性,始终与当前url匹配,第二个需要的属性叫做 element,当遇到当前url是,会告诉Route组件要渲染哪个React组件,这里的element是v6新增的,替换v5中的component的属性

  1. import Children from './Children';
  2. // v5
  3. <Route path=":id" component={Children} />
  4. <Route
  5. path=":id"
  6. render={routeProps => (
  7. <Profile routeProps={routeProps} />
  8. )}
  9. />
  10. // v6
  11. <Route path=":userId" element={<Profile />} />

3.路由嵌套更简单,新增API:Outlet

​ 这个很重要,当路由被嵌套时,一般认为网页的某一部分保持不变,只有网页的子部分发生变化

​ v5 中,必须明确定义嵌套路由,v6中并非如此,他从React Router库中挑选了一个名为 Outlet 的最佳元素,为特定路由呈现任何匹配的子元素

  1. function App() {
  2. return (
  3. <BrowserRouter>
  4. <Routes>
  5. <Route path="/" element={<Home/>} />
  6. <Route path="new" element={<New/>}>
  7. <Route path=":id" element={<List/>} />
  8. <Route path="me" element={<Others/>} />
  9. </Route>
  10. </Routes>
  11. </BrowserRouter>
  12. );
  13. }
  14. function New() {
  15. return (
  16. <div>
  17. <nav>
  18. <Link to="me">My Profile</Link>
  19. </nav>
  20. {/*
  21. 将直接根据上面定义的不同路由参数,渲染<MyProfile />或<OthersProfile />
  22. */}
  23. <Outlet/>
  24. </div>
  25. )
  26. }

4.useNavigate

​ useNavigate代替useHistory,useNavigae中不在保存useHistory中的路由信息,获取路由信息通过useLocation

  1. // v5
  2. history.push('/new')
  3. history.replace('/new')
  4. history.go(-1)
  5. // v6
  6. navigate('/new')
  7. navigate('/new', {replace: true})
  8. navigate(-1)

5.useRoutes

  1. function App() {
  2. let element = useRoutes([
  3. { path: '/', element: <Home /> },
  4. { path: 'dashboard', element: <Dashboard /> },
  5. { path: 'invoices',
  6. element: <List />,
  7. children: [
  8. { path: ':id', element: <List /> },
  9. { path: 'new', element: <New /> }
  10. ]
  11. },
  12. // 重定向
  13. { path: 'home', redirectTo: '/' },
  14. // 404找不到
  15. { path: '*', element: <NotFound /> }
  16. ]);
  17. return element;
  18. }

6.v6中所有路径匹配都忽略URL尾部的’/',Route 中的strict 在v6中已被删除

  1. // v5 之前存在的路由歧义1.当前路径'/users',则<Link to='me'>将跳转<a href='/me'>2.当前路径'/users/',则<Link to='me'>将跳转<a href='/users/me'>// v6修复了这种歧义1.当前路径'/users',则<Link to='me'>将跳转<a href='/users/me'>2.当前路径'/users',则<Link to='../me'>将跳转<a href='/me'>// 像命令行中cd的用法
  2. 当前路径为 /app/dashboard
  3. <Link to='stats'>// <a href='/app/dashboard/stats'><Link to='../stats'>// <a href='/dashboard/stats'><Link to='../stats'>// <a href='/stats'><Link to='../../../stats'>// <a href='/stats'>

7.保留了v5中的useParams和useLocation

8.v6中没有withRouter,但是在类组件中很多情况下会用到

  1. const withRouter = Component => {
  2. const ComponentWithRouterProp = props => {
  3. let location = useLocation();
  4. let navigate = useNavigate();
  5. let params = useParams();
  6. return (
  7. <Component
  8. {...props}
  9. router={{location, navigate, params}}
  10. />
  11. );
  12. };
  13. return ComponentWithRouterProp;
  14. };

9.大小,从20.5KB减少到7.4KB


本文转载自: https://blog.csdn.net/qq_37440870/article/details/126635460
版权归原作者 前端~浅海鱼 所有, 如有侵权,请联系我们删除。

“React Router v6中的更新”的评论:

还没有评论