React Router 是一个用于 React 的多策略路由器。在您的应用中有三种主要的使用方式或“模式”。在整个文档中,您会看到这些图标,指示内容与哪种模式相关。
每种模式中可用的功能是递增的,因此从“声明式”到“数据”再到“框架”模式,只是在牺牲架构控制的情况下增加了更多功能。因此,根据您希望从 React Router 获得多少控制或多少帮助来选择您的模式。
模式取决于您正在使用的“顶层”路由器 API
声明式模式启用了基本的路由功能,如将 URL 匹配到组件、在应用中导航以及通过 <Link>、useNavigate 和 useLocation 等 API 提供活动状态。
import { BrowserRouter } from "react-router";
ReactDOM.createRoot(root).render(
<BrowserRouter>
<App />
</BrowserRouter>,
);
通过将路由配置移出 React 渲染,数据模式使用 loader、action 和 useFetcher 等 API 增加了数据加载、操作、待定状态等功能。
import {
createBrowserRouter,
RouterProvider,
} from "react-router";
let router = createBrowserRouter([
{
path: "/",
Component: Root,
loader: loadRootData,
},
]);
ReactDOM.createRoot(root).render(
<RouterProvider router={router} />,
);
框架模式用一个 Vite 插件包装了数据模式,以添加完整的 React Router 体验,包括:
hrefimport { index, route } from "@react-router/dev/routes";
export default [
index("./home.tsx"),
route("products/:pid", "./product.tsx"),
];
然后,您将可以访问路由模块 API,它具有类型安全的参数、loaderData、代码分割、SPA/SSR/SSG 策略等功能。
import { Route } from "+./types/product.tsx";
export async function loader({ params }: Route.LoaderArgs) {
let product = await getProduct(params.pid);
return { product };
}
export default function Product({
loaderData,
}: Route.ComponentProps) {
return <div>{loaderData.product.name}</div>;
}
每种模式都支持任何架构和部署目标,所以问题不在于您是否想要 SSR、SPA 等。而在于您想自己做多少工作。
如果您符合以下情况,请使用框架模式:
如果您符合以下情况,请使用数据模式:
如果您符合以下情况,请使用声明式模式:
<BrowserRouter> 感到满意这主要是给 LLM 用的,不过您也可以随便看看
| API | 框架 | 数据 | 声明式 |
|---|---|---|---|
| Await | ✅ | ✅ | |
| 表单 | ✅ | ✅ | |
| Link | ✅ | ✅ | ✅ |
<Link discover> |
✅ | ||
<Link prefetch> |
✅ | ||
<Link preventScrollReset> |
✅ | ✅ | |
| Links | ✅ | ||
| Meta | ✅ | ||
| NavLink | ✅ | ✅ | ✅ |
<NavLink discover> |
✅ | ||
<NavLink prefetch> |
✅ | ||
<NavLink preventScrollReset> |
✅ | ✅ | |
NavLink isPending |
✅ | ✅ | |
| Navigate | ✅ | ✅ | ✅ |
| Outlet | ✅ | ✅ | ✅ |
| PrefetchPageLinks | ✅ | ||
| Route | ✅ | ✅ | ✅ |
| Routes | ✅ | ✅ | ✅ |
| Scripts | ✅ | ||
| ScrollRestoration | ✅ | ✅ | |
| ServerRouter | ✅ | ||
| usePrompt | ✅ | ✅ | ✅ |
| useActionData | ✅ | ✅ | |
| useAsyncError | ✅ | ✅ | |
| useAsyncValue | ✅ | ✅ | |
| useBeforeUnload | ✅ | ✅ | ✅ |
| useBlocker | ✅ | ✅ | |
| useFetcher | ✅ | ✅ | |
| useFetchers | ✅ | ✅ | |
| useFormAction | ✅ | ✅ | |
| useHref | ✅ | ✅ | ✅ |
| useInRouterContext | ✅ | ✅ | ✅ |
| useLinkClickHandler | ✅ | ✅ | ✅ |
| useLoaderData | ✅ | ✅ | |
| useLocation | ✅ | ✅ | ✅ |
| useMatch | ✅ | ✅ | ✅ |
| useMatches | ✅ | ✅ | |
| useNavigate | ✅ | ✅ | ✅ |
| useNavigation | ✅ | ✅ | |
| useNavigationType | ✅ | ✅ | ✅ |
| useOutlet | ✅ | ✅ | ✅ |
| useOutletContext | ✅ | ✅ | ✅ |
| useParams | ✅ | ✅ | ✅ |
| useResolvedPath | ✅ | ✅ | ✅ |
| useRevalidator | ✅ | ✅ | |
| useRouteError | ✅ | ✅ | |
| useRouteLoaderData | ✅ | ✅ | |
| useRoutes | ✅ | ✅ | ✅ |
| useSearchParams | ✅ | ✅ | ✅ |
| useSubmit | ✅ | ✅ | |
| useViewTransitionState | ✅ | ✅ | |
| isCookieFunction | ✅ | ✅ | |
| isSessionFunction | ✅ | ✅ | |
| createCookie | ✅ | ✅ | |
| createCookieSessionStorage | ✅ | ✅ | |
| createMemorySessionStorage | ✅ | ✅ | |
| createPath | ✅ | ✅ | ✅ |
| createRoutesFromElements | ✅ | ||
| createRoutesStub | ✅ | ✅ | |
| createSearchParams | ✅ | ✅ | ✅ |
| data | ✅ | ✅ | |
| generatePath | ✅ | ✅ | ✅ |
| href | ✅ | ||
| isCookie | ✅ | ✅ | |
| isRouteErrorResponse | ✅ | ✅ | |
| isSession | ✅ | ✅ | |
| matchPath | ✅ | ✅ | ✅ |
| matchRoutes | ✅ | ✅ | ✅ |
| parsePath | ✅ | ✅ | ✅ |
| redirect | ✅ | ✅ | |
| redirectDocument | ✅ | ✅ | |
| renderMatches | ✅ | ✅ | ✅ |
| replace | ✅ | ✅ | |
| resolvePath | ✅ | ✅ | ✅ |