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

React Router未渲染:嵌套路由结构实现故障排查

嵌套React Router失效问题修复方案

我帮你找出了几个关键问题,咱们一步步来修复:

1. 核心错误:误用Router替代Route组件

在你的代码里,RouteWithSubRoutes函数和RenderRoutes的兜底路由都用了Router组件,但Router是用来包裹整个路由系统的根容器,单个路由规则必须使用react-router-dom提供的Route组件。这个错误直接导致你的路由规则完全无法被解析,所以路由组件根本不会渲染。

2. 组件调用方式不规范

你在App组件里直接用{RenderRoutes(ROUTES)}调用函数组件,虽然语法上能运行,但React推荐用JSX标签<RenderRoutes routes={ROUTES} />来渲染,这样能确保组件的生命周期和上下文被正确处理。

3. 兜底404路由写法错误

兜底路由不需要设置path属性,只要放在Switch的最后,就能自动匹配所有未命中的路径,而且同样要使用Route组件。


修正后的完整代码

routes.js 文件

import React from "react";
import { Route, Switch } from "react-router-dom"; // 引入Route,而非Router

const ROUTES = [
  { path: "/", key: "ROOT", exact: true, component: () => <h1>Log in</h1> },
  { 
    path: "/app", 
    key: "APP", 
    component: RenderRoutes, 
    routes: [
      { path: "/app", key: "APP_ROOT", exact: true, component: () => <h1>App Index</h1> },
      { path: "/app/page", key: "APP_PAGE", exact: true, component: () => <h1>App Page</h1> },
    ] 
  },
];

export default ROUTES;

function RouteWithSubRoutes(route) {
  // 替换Router为Route组件
  return (
    <Route 
      path={route.path} 
      exact={route.exact} 
      render={props => <route.component {...props} routes={route.routes} />} 
    />
  );
}

export function RenderRoutes({ routes }) { // 用解构方式接收props,更规范
  return (
    <Switch>
      {routes.map((route, i) => {
        return <RouteWithSubRoutes key={route.key} {...route} />;
      })}
      {/* 兜底路由使用Route,不设置path */}
      <Route component={() => <h1>Not Found!</h1>} />
    </Switch>
  );
}

App.js 文件

import { RenderRoutes } from './routes';
import ROUTES from './routes';

function App() {
  return (
    <div style={{ display: "flex", height: "100vh", alignItems: "stretch" }}>
      <div style={{ flex: 0.3, backgroundColor: "#f2f2f2" }}>route menu</div>
      <div>
        {/* 用JSX标签方式渲染组件 */}
        <RenderRoutes routes={ROUTES} />
      </div>
    </div>
  );
}

export default App;

确认index.js的根路由包裹

确保你的根组件被BrowserRouter正确包裹:

import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter } from 'react-router-dom';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>
);

修复后效果

  • 访问/会显示登录页
  • 访问/app会显示App Index
  • 访问/app/page会显示App Page
  • 访问未定义的路径会显示Not Found
  • 侧边的route menu也能正常显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:52:42