diff --git a/README.md b/README.md index bb7037b..46ea23b 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,7 @@ Quick Reference [Less.js](./docs/lessjs.md) [Next.js](./docs/nextjs.md) [React](./docs/react.md) +[React Router](./docs/reactrouter.md) [React Native](./docs/react-native.md) [RegEx 正则表达式](./docs/regex.md) [TypeScript](./docs/typescript.md) diff --git a/assets/reactrouter.svg b/assets/reactrouter.svg new file mode 100644 index 0000000..49b94a4 --- /dev/null +++ b/assets/reactrouter.svg @@ -0,0 +1,4 @@ + + + + diff --git a/docs/reactrouter.md b/docs/reactrouter.md new file mode 100644 index 0000000..1f2815e --- /dev/null +++ b/docs/reactrouter.md @@ -0,0 +1,1071 @@ +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 ( +
+ +