You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Router Dom错误路径未重定向到指定404页面该如何修复?

问题根因

React Router v5的<Switch>组件仅会对其直接子元素的<Route>/<PrivateRoute>做路径匹配,你把<DashboardLayout>直接作为<Switch>的子元素,只要访问的路径不匹配/login,<Switch>就会直接渲染<DashboardLayout>,不会继续匹配后面path="*"的404路由。而你访问错误路径时,<DashboardLayout>内部的私有路由没有匹配到路径,children为空,就出现了空的Dashboard布局。


修复方案

方案1:调整路由结构(推荐,符合路由最佳实践)

把<DashboardLayout>从Switch直接子级移到私有路由的公共渲染逻辑中,让Switch统一管理所有路径匹配:

<Switch>
  <Route exact path="/login" component={Login} />
  {/* 所有需要鉴权的路由统一包裹 */}
  <Route
    path={["/", "/a", "/b"]}
    render={(props) => {
      const { loading, data } = useSelector((state) => state.login)
      // 未登录直接跳转到登录页,不渲染Dashboard布局
      if (!data?.data?.token && !loading) {
        return <Redirect to='/login' />
      }
      return (
        <DashboardLayout title={title}>
          <Switch>
            <PrivateRoute exact path="/" component={Home}/>
            <PrivateRoute exact path="/a" component={A}/>
            <PrivateRoute exact path="/b" component={B}/>
          </Switch>
        </DashboardLayout>
      )
    }}
  />
  {/* 全局404路由,所有未匹配路径都会走到这里 */}
  <Route path="*" component={Page404} />
</Switch>

方案2:最小改动适配原有结构

如果不想修改现有嵌套逻辑,直接在DashboardLayout内部补充一层Switch和私有域404路由即可:

<Switch>
  <Route exact path="/login" component={Login} />
  <DashboardLayout title={title}>
    {/* 内部加一层Switch处理私有路由匹配 */}
    <Switch>
      <PrivateRoute exact path="/" component={Home}/>
      <PrivateRoute exact path="/a" component={A}/>
      <PrivateRoute exact path="/b" component={B}/>
      {/* 私有域内的404匹配,登录用户访问错误路径会带布局显示404 */}
      <Route path="*" component={Page404} />
    </Switch>
  </DashboardLayout>
</Switch>

如果需要未登录用户访问错误路径时不显示Dashboard布局,直接跳登录,只需要给外层的DashboardLayout包裹一层和PrivateRoute一致的鉴权判断即可。


内容的提问来源于stack exchange,提问作者Idris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:48:02