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

React JS函数组件如何实现子路由/嵌套路由配置

React Router v6 嵌套路由实现方案

你当前使用的是React Router v6版本,嵌套路由需要同时完成路由表配置、路由渲染逻辑适配、父组件出口配置三个环节,具体实现如下:

1. 修正并扩展路由常量配置

首先修正原有配置的语法错误,再给需要嵌套子路由的父路由添加children字段声明子路由结构,v6版本已废弃exact属性,无需额外配置:

const navbarRoutes = [
  {
    path: '/',
    text: 'user',
    main: <User />
  },
  {
    path: '/useraddress',
    text: 'useraddress',
    main: <UserAddress />,
    // 声明/useraddress路径下的嵌套子路由
    children: [
      { index: true, main: <AddressList /> }, // 访问/useraddress时默认渲染的子页面
      { path: 'add', main: <AddAddress /> }, // 匹配路径 /useraddress/add
      { path: 'edit/:id', main: <EditAddress /> } // 匹配带参数路径 /useraddress/edit/1
    ]
  }
]

2. 修改App.js的路由渲染逻辑,支持多层路由递归渲染

原有的遍历逻辑只支持单层路由,需要封装递归渲染函数,自动识别子路由并嵌套渲染:

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

// 递归渲染路由表
const renderRoutes = (routeList) => {
  return routeList.map((route) => {
    // 存在子路由时,嵌套渲染Route结构
    if (route.children?.length) {
      return (
        <Route key={route.path} path={route.path} element={route.main}>
          {renderRoutes(route.children)}
        </Route>
      )
    }
    // 普通路由/ index路由直接渲染
    return (
      <Route 
        key={route.path || 'index'} 
        path={route.path} 
        index={route.index} 
        element={route.main} 
      />
    )
  })
}

function App() {
  return (
    <div className="app-container">
      {/* 全局公共内容比如顶部导航栏可以放在这里 */}
      <Routes>
        {renderRoutes(navbarRoutes)}
      </Routes>
    </div>
  )
}

export default App

3. 在/useraddress对应的父组件中添加子路由出口

嵌套路由的子内容不会自动展示,需要在父组件(即示例中的UserAddress组件)中引入Outlet组件作为子路由的渲染占位,父组件的公共布局(比如选项卡、侧边栏)可以和Outlet共存:

import { Outlet, NavLink } from 'react-router-dom'

function UserAddress() {
  return (
    <div className="user-address-page">
      {/* 地址页公共导航 */}
      <div className="address-tab-bar">
        <NavLink to="/useraddress">地址列表</NavLink>
        <NavLink to="/useraddress/add">新增地址</NavLink>
      </div>
      {/* 子路由内容将渲染在Outlet位置 */}
      <div className="address-content-wrap">
        <Outlet />
      </div>
    </div>
  )
}

export default UserAddress

配置注意事项

  • React组件名称必须首字母大写,原配置中的<useraddress>为错误写法,React会将其识别为原生DOM标签,需改为大驼峰命名的<UserAddress />,且JSX标签必须自闭合
  • 子路由的path不要以/开头,写相对路径即可自动拼接父路由前缀;如果加了开头的/,会被识别为根路径下的绝对路由,丢失嵌套关系
  • index: true标记的是父路由的默认子路由,访问父路由路径时会自动渲染该路由内容,不需要配置path属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:45:33