本文档解释了 RouterProvider 组件和 React Router 中各种路由器的用途和功能。它涵盖了路由器的创建、配置和集成到 React 应用程序中的方法,以及基于组件的方法和数据路由方法的区别。有关路由配置的信息,请参阅 Routes and Route。
React Router 为您的应用程序建立路由提供了两种基本方式:
<RouterProvider> 组件的路由器对象的现代方法。来源
RouterProvider 组件是使用数据路由器应用程序的入口点。它接收由 createBrowserRouter、createHashRouter 或 createMemoryRouter 等函数创建的路由器实例,并根据当前位置渲染您的应用程序。
| 属性 | 类型 | 描述 |
|---|---|---|
router | DataRouter | 必需。管理路由状态和导航的路由器实例。 |
flushSync | (fn: () => unknown) => undefined | 可选。用于与 React DOM 进行同步更新。 |
来源
RouterProvider 设置了几个上下文提供程序,以使路由信息在您的组件树中可用。
来源
React Router 提供多种函数来根据您的环境需求创建路由器实例。
创建一个使用 HTML5 history API 来在 Web 浏览器中提供干净 URL 的路由器。
来源
创建一个使用 URL 的哈希部分来存储路由信息的路由器。适用于您无法控制服务器的环境。
来源
创建一个将历史记录存储在内存中的路由器,适用于测试或非浏览器环境。
来源
创建路由器时,可以提供各种选项来定制其行为。
| 选项 | 类型 | 描述 |
|---|---|---|
basename | 字符串 | 所有路由的基础 URL 路径。 |
future | Partial<FutureConfig> | 即将推出的功能的特性标志。 |
hydrationData | HydrationState | 服务器端渲染的预加载数据。 |
initialEntries | InitialEntry[] | 内存路由器的初始历史记录条目。 |
initialIndex | 数字 | 内存路由器在历史堆栈中的起始索引。 |
window | 窗口 | Window 对象覆盖(用于测试)。 |
dataStrategy | DataStrategyFunction | 覆盖默认数据加载策略。 |
patchRoutesOnNavigation | PatchRoutesOnNavigationFunction | 用于懒路由发现的函数。 |
来源
React Router 还提供基于组件的路由器,可以直接在 JSX 中使用。这些路由器更简单,但不支持数据加载功能。
一个使用 HTML5 history API 的组件路由器。
来源
一个使用 URL 的哈希部分的组件路由器。
来源
一个将历史记录保存在内存中的组件路由器。
来源
当使用带数据路由器的 RouterProvider 时,内部组件层次结构如下:
来源
RouterProvider 组件在导航发生时管理状态更新和转换。
来源
RouterProvider 组件在使用服务器端渲染时支持 hydration。
当路由正在 hydration 但需要数据获取时,您可以使用 hydrateFallbackElement 来显示加载状态。
来源
React Router 中路由方式的两种方法的比较:
| 功能 | 数据路由器 | 组件路由器 |
|---|---|---|
| 实现 | 基于对象的 API,使用 RouterProvider | 基于组件的 API(<BrowserRouter>) |
| 数据加载 | 通过 loaders 和 actions 支持。 | 不支持 |
| 错误处理 | 内置错误边界。 | 手动错误处理。 |
| 代码分割(Code splitting) | 内置懒加载支持。 | 需要手动设置。 |
| 服务器渲染 | 通过 hydration 提供一流支持。 | 有限支持 |
| 类型安全 | 更好的 TypeScript 集成。 | 基础 TypeScript 支持。 |
来源
为新应用程序使用数据路由器:带 RouterProvider 的数据路由器模式提供了更好的性能和更多功能。
集中路由定义:在一个地方定义所有路由,以提高可维护性。
利用 TypeScript:React Router 具有强大的 TypeScript 支持,尤其是在数据路由器模式下。
视图过渡:在浏览器支持的情况下,使用 viewTransition prop 实现路由之间的平滑过渡。
服务器端渲染:在使用 SSR 时,提供 hydration 数据,以避免客户端不必要的数据获取。
来源