SuperAPI AI 工具集

react-router

前端与建站

查看项目

更新于 10-15 15:32

技能介绍

用途

react-router 是 TanStack Router 的 React 绑定包(@tanstack/react-router),用于在 React 应用中构建类型安全的路由。该技能建立在 router-core 之上,建议先阅读 router-core 了解基础概念。

文档特别强调三点:TanStack Router 的类型是完全推断的,不要做类型断言或对推断值加注解;它是客户端优先的,loader 默认在客户端运行而非服务端;不要把它与 react-router-dom/react-router 混淆,它们是 API 完全不同的库。

主要能力

组件

  • RouterProvider:在 React 树顶部挂载路由器。
  • Link:类型安全的导航链接,具备 <a> 语义。
  • Outlet:渲染匹配到的子路由组件。
  • Navigate:声明式重定向组件。
  • Await:配合 Suspense 渲染未 await 的 loader Promise 中的延迟数据。
  • CatchBoundary:组件级错误边界(路由级错误使用 errorComponent 路由选项)。

Hook(均从 @tanstack/react-router 导入)

  • useRouter():直接访问路由器实例。
  • useRouterState():订阅路由器状态变化;会暴露整个状态,有性能开销,匹配或位置信息建议用 useMatches 和 useLocation。
  • useNavigate():编程式导航(用户可点击元素优先用 <Link>)。
  • useSearch({ from }):读取经过校验的搜索参数。
  • useParams({ from }):读取路径参数。
  • useLoaderData({ from }):读取路由 loader 返回的数据。
  • useMatch({ from }):访问完整的路由匹配(参数、搜索、loader 数据、上下文)。
  • useMatches():所有活跃路由匹配的数组(适合面包屑)。
  • useRouteContext({ from }):读取 beforeLoad 或父路由的上下文。
  • useBlocker({ shouldBlockFn }):为未保存更改阻止导航。
  • useCanGoBack():返回布尔值,检查历史记录中是否有可返回的条目。
  • useLocation():当前解析后的位置(pathname、search、hash)。
  • useLinkProps({ to, params?, search? }):为自定义链接元素获取 <a> 属性。
  • useMatchRoute():返回函数 matchRoute({ to }) => match | false。

使用方式

基于 Vite 的文件式路由完整搭建

  1. 安装依赖:
npm install @tanstack/react-router
npm install -D @tanstack/router-plugin @tanstack/react-router-devtools
  1. 配置 Vite 插件(必须放在 react() 之前):
// vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { tanstackRouter } from '@tanstack/router-plugin/vite'

export default defineConfig({
  plugins: [
    // MUST come before react()
    tanstackRouter({
      target: 'react',
      autoCodeSplitting: true,
    }),
    react(),
  ],
})
  1. 创建根路由(src/routes/__root.tsx),使用 createRootRoute 定义 RootLayout,包含导航 Link、Outlet 和 TanStackRouterDevtools。

  2. 创建路由文件(如 src/routes/index.tsx、src/routes/about.tsx),使用 createFileRoute 定义组件。

  3. 创建路由器实例并注册类型(src/main.tsx):

import { RouterProvider, createRouter } from '@tanstack/react-router'
import { routeTree } from './routeTree.gen'

const router = createRouter({ routeTree })

// REQUIRED — without this, Link/useNavigate/useSearch have no type safety
declare module '@tanstack/react-router' {
  interface Register {
    router: typeof router
  }
}

React 专属模式

  • 使用 createLink 包装 Link 为自定义组件,同时保留类型安全。
  • 跨多个路由复用组件时,为 from 属性传入路由路径的联合类型,避免使用 strict: false。
  • 若路由使用认证上下文(通过 createRootRouteWithContext),认证 Provider 必须是 RouterProvider 的祖先;也可使用 Wrap 路由器选项在不外部包裹的情况下提供上下文。

适用场景

适用于使用 React 构建、需要类型安全路由的应用,尤其是采用 Vite 与文件式路由的项目。文档覆盖搜索参数、数据加载、导航、认证、SSR 等由 router-core 子技能展开的领域。

限制与常见错误

  • 不要在 beforeLoad 或 loader 中使用 React Hook:它们是普通异步函数而非 React 组件,认证状态应通过路由器上下文传递。
  • 不要错误地把 RouterProvider 包在认证 Provider 内部:应只创建一次路由器(用 undefined! 占位),再通过 RouterProvider 的 context 属性注入实时认证;不要在认证变化时重建路由器,否则会重置缓存并重建路由树。
  • Await/延迟数据缺少 Suspense 边界:Await 需要 <Suspense> 祖先,否则延迟 Promise 没有回退 UI 并会抛出错误。

关于收费、价格、平台支持范围等信息,资料中暂未提供。