v6路由表优化

彩虹的尽头 +0/-0 0 0 正常 2025-12-24T07:01:19 React-Router · 路由优化

v6路由表优化踩坑记录

从v5升级到v6后,路由表优化成了一个大坑。原本的路由配置在v6中完全不兼容了。

问题重现

// v5写法
<Route path="/user/:id" component={User} />
<Route path="/user" component={UserList} />

// v6写法
<Routes>
  <Route path="/user/:id" element={<User />} />
  <Route path="/user" element={<UserList />} />
</Routes>

核心优化点

  1. 路由嵌套:v6强制使用useRoutesRoutes组件,不再支持嵌套路由
  2. 参数获取match.params改为useParams()钩子
  3. 重定向<Redirect>Navigate替代

实际优化代码

// 优化前
const routes = [
  { path: '/user', component: UserList },
  { path: '/user/:id', component: User }
]

// 优化后
function AppRoutes() {
  return (
    <Routes>
      <Route path="/" element={<Layout />}>
        <Route index element={<Home />} />
        <Route path="user">
          <Route index element={<UserList />} />
          <Route path=":id" element={<User />} />
        </Route>
      </Route>
    </Routes>
  )
}

注意事项

  • v6中必须使用element属性替换component
  • 嵌套路由需要在父路由中用<Outlet />渲染子路由
  • useNavigate替代history.push

升级后路由表清晰度提升,但迁移成本不小。

推广
广告位招租

讨论

0/2000
Bob974
Bob974 · 2026-01-08T10:24:58
v6的路由改法确实让人头大,但习惯了就好。建议先用useRoutes做迁移,再逐步重构。
Steve775
Steve775 · 2026-01-08T10:24:58
参数获取从match.params到useParams,虽然代码变多了,但更符合hooks规范。
DryFire
DryFire · 2026-01-08T10:24:58
嵌套路由是v6的重大变化,别忘了在父组件里加<Outlet />,不然子路由直接不显示。
Diana73
Diana73 · 2026-01-08T10:24:58
重定向用Navigate替代,写法简单了,但要记得import,别漏了这一步。
Nora439
Nora439 · 2026-01-08T10:24:58
升级前最好先备份旧路由配置,迁移时可以对比着改,避免全盘推倒。
AliveSky
AliveSky · 2026-01-08T10:24:58
element属性替换component是个小细节,但容易被忽略,建议写个eslint规则自动提醒。
魔法使者
魔法使者 · 2026-01-08T10:24:58
用v6的路由表确实更清晰,特别是嵌套路由和Outlet配合,适合大型项目结构化