Home v6.4.1

官网

官网地址:https://reactrouter.com/en/main
image.png

Redux官网相同的是,都提供了一个很好的示例项目和完整的代码来帮助你使用routerredux,从而对这两者进行更好的理解。但react-router-dom没有汉化版的官网,因此阅读起来需要有一定的英文基础,或者需要借助翻译软件进行翻译。

指导手册(教程)

根据官网上的教程,我们将会学习制作如下图所示的网页:
React路由@v6 - 图2

起步

使用的是vite进行项目的初始化,下面是vite的官网:https://cn.vitejs.dev/
Vite
使用如下命令,可以初始化一个react-ts的空项目

  1. npm create vite@latest react-vite-demo --template react-ts

根据提示,自行选择相关的配置
然后进入代码文件夹,输入如下命令,启动项目

  1. cd <your new project directory>
  2. npm install react-router-dom localforage match-sorter sort-by
  3. npm run dev

🌈 更改预设的CSS样式表 点击获取CSS样式
点击上述蓝色文字,并将其中的CSS代码粘贴到src/index.css
一切准备就绪~

添加一个路由

我们选择使用BrowserRouter来作为路由器的类型,在main.tsx文件中创建并配置渲染路由

  1. import React from "react";
  2. import ReactDOM from "react-dom/client";
  3. import {
  4. createBrowserRouter,
  5. RouterProvider,
  6. Route,
  7. } from "react-router-dom";
  8. import "./index.css";
  9. const router = createBrowserRouter([
  10. {
  11. path: "/",
  12. element: <div>Hello world!</div>,
  13. },
  14. ]);
  15. ReactDOM.createRoot(document.getElementById("root")).render(
  16. <React.StrictMode>
  17. <RouterProvider router={router} />
  18. </React.StrictMode>
  19. );

我们添加的第一个路由,一般是根组件(root)路由:主要用于绘制页面布局

根组件路由

创建如下文件:src/routes/root.tsx,并将下面的代码粘贴到其中

  1. export default function Root() {
  2. return (
  3. <>
  4. <div id="sidebar">
  5. <h1>React Router Contacts</h1>
  6. <div>
  7. <form id="search-form" role="search">
  8. <input
  9. id="q"
  10. aria-label="Search contacts"
  11. placeholder="Search"
  12. type="search"
  13. name="q"
  14. />
  15. <div
  16. id="search-spinner"
  17. aria-hidden
  18. hidden={true}
  19. />
  20. <div
  21. className="sr-only"
  22. aria-live="polite"
  23. ></div>
  24. </form>
  25. <form method="post">
  26. <button type="submit">New</button>
  27. </form>
  28. </div>
  29. <nav>
  30. <ul>
  31. <li>
  32. <a href={`contacts/1`}>Your Name</a>
  33. </li>
  34. <li>
  35. <a href={`contacts/2`}>Your Friend</a>
  36. </li>
  37. </ul>
  38. </nav>
  39. </div>
  40. <div id="detail"></div>
  41. </>
  42. );
  43. }

部分代码并不存在很难的逻辑,因此为了快速上手、学习,可以直接进行复制和粘贴这些代码。

🌈 配置默认路由的组件

  1. /* existing imports */
  2. import Root from "./routes/root";
  3. const router = createBrowserRouter([
  4. {
  5. path: "/",
  6. element: <Root />,
  7. },
  8. ]);
  9. ReactDOM.createRoot(document.getElementById("root")).render(
  10. <React.StrictMode>
  11. <RouterProvider router={router} />
  12. </React.StrictMode>
  13. );

如果正常编写并配置完了上述内容,那么显示的页面应该如下所示:
React路由@v6 - 图3

错误处理

我们在使用应用的过程中,难免会出现一些问题,如下所示:
React路由@v6 - 图4
这就是React Router给我们提供的默认的处理错误的页面,但由于我们设置的css样式的原因,导致其显示有一些问题。因此,我们可以对错误页面进行配置。
创建一个错误页面的组件:touch src/error-page.tsx

  1. import { useRouteError } from "react-router-dom";
  2. export default function ErrorPage() {
  3. const error = useRouteError();
  4. console.error(error);
  5. return (
  6. <div id="error-page">
  7. <h1>Oops!</h1>
  8. <p>Sorry, an unexpected error has occurred.</p>
  9. <p>
  10. <i>{error.statusText || error.message}</i>
  11. </p>
  12. </div>
  13. );
  14. }

并配置为根路由的错误页面:

  1. /* previous imports */
  2. import ErrorPage from "./error-page";
  3. const router = createBrowserRouter([
  4. {
  5. path: "/",
  6. element: <Root />,
  7. errorElement: <ErrorPage />,
  8. },
  9. ]);
  10. ReactDOM.createRoot(document.getElementById("root")).render(
  11. <React.StrictMode>
  12. <RouterProvider router={router} />
  13. </React.StrictMode>
  14. );

当我们再次触发错误,就会显示如下页面:
React路由@v6 - 图5

我们可以使用useRouteError来获取当前触发的异常,并获取到这个异常的一些基本信息

For now, it’s enough to know that pretty much all of your errors will now be handled by this page instead of infinite spinners, unresponsive pages, or blank screens 🙌

联系人页面