
react router v6 中嵌套路由无法渲染,通常是因为父路由组件未正确使用 组件占位;若父组件不渲染 Outlet,子路由的 element 将无处挂载,导致页面空白或回退到上级布局。
react router v6 中嵌套路由无法渲染,通常是因为父路由组件未正确使用 `
在 React Router v6 中,嵌套路由(Nested Routes)的设计理念是布局复用与内容插槽化:父路由定义共享 ui 结构(如标题、导航栏、表单容器),子路由则通过
你当前代码中,/auth 路由配置了子路径 new-user:
<Route path="/auth" element={<Login />}> <Route path="new-user" element={<CreateUser />} /> </Route>
该配置语义明确:当访问 /auth/new-user 时,应渲染
✅ 正确做法:在 Login.tsx 中导入并渲染
import { Outlet, Link, useNavigate } from "react-router-dom"; // ✅ 添加 Outlet 导入 const Login = () => { // ... 状态与逻辑保持不变 return ( <> <Title /> <div className={styles.loginForm}> <h2>Login</h2> <form onSubmit={handleSubmit}> {/* 表单字段保持不变 */} </form> <Link to="new-user">Create New User</Link> </div> <Outlet /> {/* ✅ 关键:为子路由预留渲染位置 */} </> ); }; export default Login;
⚠️ 注意事项:
-
必须出现在父组件的 JSX 中,且位置决定子组件渲染区域(例如放在表单下方,CreateUser 就会显示在登录表单之后); - to 属性使用相对路径(如 “new-user”)时,会基于当前路由层级解析;若需跳转到绝对路径,应写为 “/auth/new-user”;
- 若 Login 本身不应作为布局(即你希望 /auth 和 /auth/new-user 是两个完全独立的全页视图),则应改用布局路由(Layout Route)模式——将 /auth 设为仅含
的空布局,再把 Login 和 CreateUser 作为其子路由:
// 推荐用于真正分离的页面场景 <Route path="/auth"> <Route index element={<Login />} /> {/* 访问 /auth 时渲染 Login */} <Route path="new-user" element={<CreateUser />} /> {/* 访问 /auth/new-user 时渲染 CreateUser */} </Route>
此时 /auth 路由默认提供内置
? 总结:React Router v6 的嵌套路由不是“自动继承”,而是“显式委托”。每一次父子关系都必须由父组件主动调用