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

React Router嵌套路由配置:如何设置/admin/:userId/settings/:settingId路由

嘿,我来帮你搞定这个嵌套路由的配置问题~你的写法其实差了关键几步,而且得看你用的是React Router v5还是v6(这俩版本的嵌套路由写法差别不小),我分开给你讲:

React Router v6(当前主流版本)

v6对嵌套路由做了更清晰的设计,核心要用到<Outlet>组件作为子路由内容的占位符,同时注意路径的相对写法:

import { Routes, Route, Outlet, useParams } from 'react-router-dom';

// 父级页面组件
function AdminPage() {
  // 在这里获取userId参数
  const { userId } = useParams();
  return (
    <div>
      <h2>Admin Panel for User {userId}</h2>
      {/* 子路由的内容会渲染在这个Outlet里 */}
      <Outlet />
    </div>
  );
}

// 子级设置页面组件
function SettingPage() {
  // 可以同时获取userId和settingId两个参数
  const { userId, settingId } = useParams();
  return (
    <div>
      <p>Editing Setting #{settingId} for User {userId}</p>
    </div>
  );
}

// 全局路由配置
function App() {
  return (
    <Routes>
      {/* 父路由定义基础路径 */}
      <Route path="/admin/:userId" element={<AdminPage />}>
        {/* 子路由用相对路径(不要加开头的/),会自动拼接成 /admin/:userId/settings/:settingId */}
        <Route path="settings/:settingId" element={<SettingPage />} />
      </Route>
    </Routes>
  );
}

关键注意点:

  • 父路由组件必须渲染<Outlet />,否则子路由的内容无处展示
  • 子路由的路径是相对路径(无开头斜杠),会自动和父路由路径拼接
  • 用useParams()钩子可以轻松获取URL中的动态参数
React Router v5(旧版本)

v5的嵌套路由逻辑和v6不同,核心是父路由不能加exact属性,同时要利用match.url来拼接子路由路径:

import { Switch, Route, useParams } from 'react-router-dom';

// 父级页面组件
function AdminPage({ match }) {
  // v5.1+支持useParams,更早版本可以用match.params获取参数
  const { userId } = useParams();
  return (
    <div>
      <h2>Admin Panel for User {userId}</h2>
      {/* 嵌套的Switch用来匹配子路由 */}
      <Switch>
        {/* 用match.url拼接父路径,生成完整的子路由路径 */}
        <Route path={`${match.url}/settings/:settingId`} component={SettingPage} />
      </Switch>
    </div>
  );
}

// 子级设置页面组件
function SettingPage() {
  const { userId, settingId } = useParams();
  return (
    <div>
      <p>Editing Setting #{settingId} for User {userId}</p>
    </div>
  );
}

// 全局路由配置
function App() {
  return (
    <Switch>
      {/* 父路由绝对不能加exact!否则子路由路径无法匹配父路由 */}
      <Route path="/admin/:userId" component={AdminPage} />
    </Switch>
  );
}

关键注意点:

  • 父路由必须去掉exact属性,否则只有完全匹配/admin/:userId的路径才会触发,子路由路径/admin/:userId/settings/:settingId会匹配失败
  • 子路由路径可以通过match.url动态拼接,避免硬编码父路径

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:36:14