React Router 备忘清单 === [![NPM version](https://img.shields.io/npm/v/react-router-dom.svg?style=flat)](https://npmjs.org/package/react-router-dom) [![Downloads](https://img.shields.io/npm/dm/react-router-dom.svg?style=flat)](https://www.npmjs.com/package/react-router-dom) [![Repo Dependents](https://badgen.net/github/dependents-repo/remix-run/react-router)](https://github.com/remix-run/react-router/network/dependents) [![Github repo](https://badgen.net/badge/icon/Github?icon=github&label)](https://github.com/remix-run/react-router) 适合初学者的综合 [React Router 6.x](https://reactrouter.com/en/main/start/overview) 备忘清单 入门 ---- ### 安装使用 ```bash $ npm create vite@latest myApp --\ --template react # 按照提示操作 $ cd $ npm install react-router-dom \ localforage \ match-sorter \ sort-by $ npm run dev ``` ### 添加路由器 ```jsx {3-6,8-13,19} import React from "react"; import ReactDOM from "react-dom/client"; import { createBrowserRouter, RouterProvider, } from "react-router-dom"; const router = createBrowserRouter([ { path: "/", element:
Hello world!
, }, ]); const root=document.getElementById('root'); ReactDOM.createRoot(root).render( ); ``` ### 根路由 ```jsx {1,6} import Root from "./routes/root"; const router = createBrowserRouter([ { path: "/", element: , }, ]); ``` ### 处理未找到错误 ```jsx {1,7} import ErrorPage from "./error-page"; const router = createBrowserRouter([ { path: "/", element: , errorElement: , }, ]); ``` ### `contacts` 用户界面 ```jsx {1,9-12} import Contact from "./routes/contact"; const router = createBrowserRouter([ { path: "/", element: , errorElement: , }, { path: "contacts/:contactId", element: , }, ]); ``` ### 嵌套路由 `src/main.jsx` ```jsx {6-11} const router = createBrowserRouter([ { path: "/", element: , errorElement: , children: [ { path: "contacts/:contactId", element: , }, ], }, ]); ``` `src/routes/root.jsx` ```jsx {1,8} import { Outlet } from "react-router-dom"; export default function Root() { return ( <> {/* 所有其他元素 */}
); } ``` ### 客户端路由 ```jsx {2,9,14} import { Outlet, Link } from "react-router-dom"; export default function Root() { return (
  • Your Name
  • Your Friend
); } ``` ### 创建联系人 创建动作并将 `
` 更改为 `` ```jsx {5,8,11-14,20-22} import { Outlet, Link, useLoaderData, Form, } from "react-router-dom"; import { getContacts, createContact } from "../contacts"; export async function action() { const contact = await createContact(); return { contact }; } export default function Root() { const { contacts } = useLoaderData(); return (
); } ``` 导入并设置路由上的 `action` ```jsx {3,12} import Root, { loader as rootLoader, action as rootAction, } from "./routes/root"; const router = createBrowserRouter([ { path: "/", element: , errorElement: , loader: rootLoader, action: rootAction, children: [ { path: "contacts/:contactId", element: , }, ], }, ]); ``` ### 加载程序中的 URL 参数 ```jsx {3} [ { path: "contacts/:contactId", element: , }, ]; ``` `:contactId` URL 段。 冒号(:)具有特殊含义,将其变成“`动态段`” ```jsx {1-4,6-8,11} import { useLoaderData } from "react-router-dom"; import { getContact } from "../contacts"; export async function loader({ params }) { return getContact(params.contactId); } export default function Contact() { const contact = useLoaderData(); // existing code } ``` 在路由上配置 `loader` ```jsx {2,16} import Contact, { loader as contactLoader, } from "./routes/contact"; const router = createBrowserRouter([ { path: "/", element: , errorElement: , loader: rootLoader, action: rootAction, children: [ { path: "contacts/:contactId", element: , loader: contactLoader, }, ], }, ]); ``` ### 更新数据 ```jsx import { Form, useLoaderData } from "react-router-dom"; export default function EditContact() { const contact = useLoaderData(); return (