当前位置:   article > 正文

ReactRouter v6升级的步骤

ReactRouter v6升级的步骤

React Router v6 引入了一个 Routes 组件,它有点像 Switch ,但功能要强大得多。与 Switch 相比, Routes 的主要优势在于:

  • <Routes> 中的所有 <Route> 和 <Link> 都是相对的。这导致在 <Route path> 和 <Link to> 中的代码更精简和更可预测。
  • 路由的选择基于最佳匹配,而不是按顺序遍历。这避免了由于在 <Switch> 中定义较晚而导致无法到达的错误。
  • 路由可以嵌套在一个地方,而不是分散在不同的组件中。在中小型应用程序中,这样可以方便地一次性查看所有路由。在大型应用程序中,您仍然可以通过 React.lazy 动态加载将路由嵌套在打包中。

v6,您需要将所有 <Switch> 元素转换为 <Routes> 。

首先,让我们来谈谈 v6 中的相对路由和链接。

v5 是这样写:

  1. // This is a React Router v5 app
  2. import {
  3. BrowserRouter,
  4. Switch,
  5. Route,
  6. Link,
  7. useRouteMatch,
  8. } from "react-router-dom";
  9. function App() {
  10. return (
  11. <BrowserRouter>
  12. <Switch>
  13. <Route exact path="/">
  14. <Home />
  15. </Route>
  16. <Route path="/users">
  17. <Users />
  18. </Route>
  19. </Switch>
  20. </BrowserRouter>
  21. );
  22. }
  23. function Users() {
  24. // In v5, nested routes are rendered by the child component, so
  25. // you have <Switch> elements all over your app for nested UI.
  26. // You build nested routes and links using match.url and match.path.
  27. let match = useRouteMatch();
  28. return (
  29. <div>
  30. <nav>
  31. <Link to={`${match.url}/me`}>My Profile</Link>
  32. </nav>
  33. <Switch>
  34. <Route path={`${match.path}/me`}>
  35. <OwnUserProfile />
  36. </Route>
  37. <Route path={`${match.path}/:id`}>
  38. <UserProfile />
  39. </Route>
  40. </Switch>
  41. </div>
  42. );
  43. }

v6需要这个样子:

  1. // This is a React Router v6 app
  2. import {
  3. BrowserRouter,
  4. Routes,
  5. Route,
  6. Link,
  7. } from "react-router-dom";
  8. function App() {
  9. return (
  10. <BrowserRouter>
  11. <Routes>
  12. <Route path="/" element={<Home />} />
  13. <Route path="users/*" element={<Users />} />
  14. </Routes>
  15. </BrowserRouter>
  16. );
  17. }
  18. function Users() {
  19. return (
  20. <div>
  21. <nav>
  22. <Link to="me">My Profile</Link>
  23. </nav>
  24. <Routes>
  25. <Route path=":id" element={<UserProfile />} />
  26. <Route path="me" element={<OwnUserProfile />} />
  27. </Routes>
  28. </div>
  29. );
  30. }

v5 应用程序中的所有 <Route children> 在 v6 中都变为了 <Route element={}>

对于子路由,index设置为true时,相当于一个默认的子路由

关于 <Route path> 模式的注意事项

React Router v6 使用简化的路径格式。在 v6 中, <Route path> 只支持两种占位符:动态 :id 样式的参数和 * 通配符。 * 通配符只能在路径末尾使用,不能在中间使用。

/groups
/groups/admin
/users/:id
/users/:id/messages
/files/*
/files/:id/*

在 v6 中,无论当前 URL 如何, <Link to="me"> 都会呈现相同的 <a href> 。 

使用useRoutes代替react-router-config

v5 版本的 react-router-config 包中的所有功能都已移至 v6 的核心中。如果您喜欢/需要将路由定义为 JavaScript 对象,而不是使用 React 元素,那么您一定会喜欢这个功能。

  1. function App() {
  2. let element = useRoutes([
  3. // These are the same as the props you provide to <Route>
  4. { path: "/", element: <Home /> },
  5. { path: "dashboard", element: <Dashboard /> },
  6. {
  7. path: "invoices",
  8. element: <Invoices />,
  9. // Nested routes use a children property, which is also
  10. // the same as <Route>
  11. children: [
  12. { path: ":id", element: <Invoice /> },
  13. { path: "sent", element: <SentInvoices /> },
  14. ],
  15. },
  16. // Not found routes work as you'd expect
  17. { path: "*", element: <NotFound /> },
  18. ]);
  19. // The returned element will render the entire element
  20. // hierarchy with all the appropriate context it needs
  21. return element;
  22. }

使用useNavigate代替useHistory

React Router v6 引入了新的导航 API,该 API 与 <Link> 同义,可更好地兼容启用了悬念的应用程序。根据您的风格和需求,我们提供了该 API 的命令式和声明式版本。

useHistory 更改为 useNavigate ,并更改 history.push 或 history.replace 调用站点。

  1. // This is a React Router v6 app
  2. import { useNavigate } from "react-router-dom";
  3. function App() {
  4.   let navigate = useNavigate();
  5.   function handleClick() {
  6.     navigate("/home");
  7.   }
  8.   return (
  9.     <div>
  10.       <button onClick={handleClick}>go home</button>
  11.     </div>
  12.   );
  13. }

注意:请注意,v5 版 <Redirect /> 默认使用 replace 逻辑(可通过 push 属性进行更改),而 v6 版 <Navigate /> 默认使用 push 逻辑,可通过 replace 属性进行更改。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/850110
推荐阅读
相关标签
  

闽ICP备14008679号