react-router嵌套路由访问路径不匹配、找不到路由问题排查
问题根因
这不是遗漏配置导致的,本质是对React Router v6的路由匹配逻辑、<Routes>组件的运行机制理解有偏差。
核心规则如下:
- 同一个
<Routes>容器下的同级路由,默认以应用根路径为起点做绝对路径匹配,不会自动继承上层组件对应的路由前缀。 - 只有将子路由直接作为父
<Route>的子元素写在同一份路由配置中时,React Router才会自动建立父子路由的嵌套匹配关系,自动拼接路径前缀,同时父组件通过<Outlet />渲染子路由内容。 - 如果父路由对应的渲染组件内部再单独嵌套一个
<Routes>,这个内部的<Routes>是一套独立的匹配上下文,不会自动感知外层路由的匹配状态;且如果外层父路由没有配置尾部通配符,非父路由精确匹配的路径根本不会触发父组件渲染,内部的路由逻辑连执行的机会都没有。
对应你最初的代码问题:
顶层路由仅配置了path='/'对应OptInPage组件,这是一个精确匹配规则。当你访问/get-items时,顶层<Routes>拿当前路径和已配置的规则比对,/get-items和/不相等,直接判定无匹配路由,根本不会渲染OptInPage组件,组件内部定义的那堆路由规则完全不会被执行,自然报路由不存在。
你修改后的代码能正常运行,是因为把所有路由规则都收拢到了顶层<Routes>下统一做匹配,访问/get-items(你贴的修改后代码里笔误写成了get-connections)时能直接命中对应规则,路由自然正常渲染。这也是React Router官方推荐的标准嵌套路由写法,布局类路由只需要在组件内预留<Outlet />作为子路由渲染出口即可,不需要额外在组件内套<Routes>。
如果你确实需要把部分路由规则拆分到组件内部维护,只需要修改顶层对应父路由的路径,加上尾部通配符即可:
// 把原有的 path='/' 改成 path='/*' <Route path='/*' element={<OptInPage />} />
加了通配符后,所有以/开头的路径都会先渲染OptInPage组件,组件内部的<Routes>才能拿到剩余路径段继续做匹配。但这种写法不推荐,路由规则散落在各个业务组件中,后续维护时很难全局梳理所有路由配置,容易出现重复匹配、漏匹配的问题。
内容的提问来源于stack exchange,提问作者Edgar Barber
相关产品推荐
相关产品推荐

