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 体验,包括:
href
import { 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 | ✅ | ✅ | ✅ |