新闻中心

在 React Router 中利用 Outlet 实现组件嵌套渲染

2025-11-03
浏览次数:
返回列表

在 react router 中利用 outlet 实现组件嵌套渲染

理解 React Router 的 Outlet 组件

在构建复杂的单页应用时,我们经常需要在一个父组件(例如一个布局组件,包含侧边栏和头部导航)的特定区域内动态地渲染不同的子组件。React Router v6 引入的 Outlet 组件正是为解决这一问题而设计的。它充当一个占位符,用于渲染当前匹配到的子路由所对应的组件。这意味着,当你的路由结构存在嵌套关系时,父路由组件可以使用 Outlet 来指定其子路由组件的渲染位置,而无需在父组件内部编写复杂的条件渲染逻辑。

实现组件嵌套渲染的步骤

要将 组件渲染到 Dashboard 组件的 .main-content div 中,我们需要进行以下两步关键修改:

1. 修改父组件 Dashboard

Dashboard 组件将作为布局容器,它需要明确指出子路由组件应该在哪里被渲染。为此,我们将在 Dashboard 组件的 .main-content div 内部添加 Outlet 组件。

修改前的 Dashboard.js 片段:

import React,{useState} from 'react'
import { Outlet } from 'react-router-dom'; // 确保引入了 Outlet
import AdminSidebar from '../AdminSidebar/AdminSidebar'
import AdminHeader from '../AdminHeader/AdminHeader';
import "./Dashboard.css"

function Dashboard() {
  // ... 其他状态和逻辑 ...

  return (
    <>
      <AdminSidebar/>
      <div className='main-content'>
        <AdminHeader handleToggleClick={handleToggleClick}/>
        {/* 这里是需要渲染子组件的位置 */}
      </div>

      {/* ... 其他元素 ... */}
    </>
  )
}

export default Dashboard

修改后的 Dashboard.js 片段:

import React,{useState} from 'react'
import { Outlet } from 'react-router-dom'; // 确保引入了 Outlet
import AdminSidebar from '../AdminSidebar/AdminSidebar'
import AdminHeader from '../AdminHeader/AdminHeader';
import "./Dashboard.css"

function Dashboard() {
  const [checkboxChecked, setCheckboxChecked] = useState(false);
  // ... 其他 handleCheckboxChange 和 handleToggleClick 逻辑 ...

  return (
    <>
      <AdminSidebar/>
      <div className='main-content'>
        <AdminHeader handleToggleClick={handleToggleClick} />
        <Outlet /> {/* 在这里渲染嵌套路由的组件 */}
      </div>

      <input type="checkbox" name='' id='sidebar-toggle' onChange={handleCheckboxChange} checked={checkboxChecked}/>
      <label htmlFor="sidebar-toggle" className='body-label' onClick={handleToggleClick}></label>
    </>
  )
}

export default Dashboard

通过在 .main-content div 中添加 ,我们告诉 React Router:当 Dashboard 组件的子路由被激活时,将子路由对应的组件渲染到这个 Outlet 的位置。

2. 配置 App.js 中的嵌套路由

在 App.js 中,我们需要重新组织路由结构,将 Dashboard 设为一个父路由,并将其下的 AdminMain 和 AddProduct 作为子路由。

OneStory OneStory

OneStory 是一款创新的AI故事生成助手,用AI快速生成连续性、一致性的角色和故事。

OneStory 319 查看详情 OneStory

修改前的 App.js 片段:

// ... 其他 import ...
import Dashboard from './Admin/Dashboard/Dashboard';
import AdminMain from './Admin/AdminMain/AdminMain';
import AddProduct from './Admin/AddProduct/AddProduct';
// ... 其他组件和状态 ...

function App() {
  // ... 其他逻辑 ...

  return (
    <>
      <Router>
        {adminRoute ? <Dashboard/>  : <Header cartItem={cartItem} userData={userData} handleSignOut={handleSignOut}/> }
        <Routes>
          <Route path='/' element={<Pages productItems={productItems} addToCart={addToCart} cartItem={cartItem} shopItems={shopItems} userData={userData} />}/>
          <Route path='/cart' element={<Cart cartItem={cartItem} addToCart={addToCart} decreaseQty={decreaseQty}/>}/>
          <Route path='/admin/dashboard' element={<AdminMain/>}/>
          <Route path='/admin/add-product' element={<AddProduct />} />
        </Routes>
      </Router>
    </>
  );
}

export default App;

修改后的 App.js 片段:

// ... 其他 import ...
import Dashboard from './Admin/Dashboard/Dashboard';
import AdminMain from './Admin/AdminMain/AdminMain';
import AddProduct from './Admin/AddProduct/AddProduct';
// ... 其他组件和状态 ...

function App() {
  // ... 其他逻辑 ...

  return (
    <>
      <Router>
        {/* 这里的条件渲染可以保留,用于在非admin路径下显示Header,在admin路径下显示Dashboard */}
        {adminRoute ? null : <Header cartItem={cartItem} userData={userData} handleSignOut={handleSignOut}/> }
        <Routes>
          <Route path='/' element={<Pages productItems={productItems} addToCart={addToCart} cartItem={cartItem} shopItems={shopItems} userData={userData} />} />
          <Route path='/cart' element={<Cart cartItem={cartItem} addToCart={addToCart} decreaseQty={decreaseQty} />} />

          {/* 定义Dashboard作为父路由,其路径为 /admin/* */}
          <Route path='/admin/*' element={<Dashboard />}>
            {/* 子路由路径相对于父路由 */}
            <Route path='dashboard' element={<AdminMain />} />
            <Route path='add-product' element={<AddProduct />} />
            {/* 可以添加一个默认子路由,例如 index */}
            {/* <Route index element={<AdminMain />} /> */}
          </Route>
        </Routes>
      </Router>
    </>
  );
}

export default App;

关键点说明:

  1. 父路由的 path 属性: 将 Dashboard 组件的路由路径设置为 /admin/*。这里的 * 是一个通配符,表示该路径下的所有子路径都将由 Dashboard 路由处理。
  2. 子路由的 path 属性: 子路由的 path 属性是相对于其父路由的。例如, element="{} />)。
  3. 以上就是在 React Router 中利用 Outlet 实现组件嵌套渲染的详细内容,更多请关注其它相关文章!


    # 拖拽  # 花瓣网网站排名优化  # 诚信数字营销推广案例  # 网站劫持 推广软件  # 网站发帖推广工具有哪些  # 东宁营销型网站建设  # 养老策略营销推广  # 河南短视频营销推广方法  # 一个seo的日常  # seo 如何消除负面  # 吉安网站营销推广公司  # 这一  # 容器内  # 是一个  # css  # 引入了  # 移除  # 自定义  # 将在  # 相对于  # 复选框  # 组件渲染  # 路由  # ai  # app  # js  # html  # react 


    相关栏目: 【 科技资讯46185 】 【 网络学院92790


    相关推荐: 126邮箱网页版官方入口 126邮箱账号在线登录平台  J*aScript中高效管理与清空动态列表:避免循环陷阱  荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  Go RPC HTTP服务正确实现与常见陷阱解析  Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式  Excel文件在线转换快速入口 Excel在线格式转换网站  AO3网页版合集入口 Archive of Our Own同人作品浏览指南  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE  优化Django表单:提交验证失败后保留用户输入  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  Lar*el头像管理:图片缩放与旧文件删除的最佳实践  12306怎么选座位选到安静区_12306选座安静区域选择策略  msn官网入口地址手机版 msn官方网站手机最新链接  ArrayList与LinkedList操作复杂度详解:遍历与修改  12306选座怎么选到商务座_12306商务座选择与配置说明  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法  台积电1.4nm工艺A14瞄准2028:10年来性能提升80%  Golang如何实现状态模式管理对象状态_Golang State模式实现技巧  CSS布局中意外空白:解决padding-top导致的顶部间距问题  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  Android Studio计算器C键功能异常排查与修复教程  微博网页版首页入口 微博电脑端官网登录链接  Linux如何构建多环境配置管理_Linux多环境配置方案  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  反效果?《战地6》免费试玩开启后玩家数不升反降  Excel Power Pivot如何处理XML数据源 构建高级数据模型  使用J*aScript检测输入元素是否包含在特定类中  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  网站内容防复制粘贴的实现策略与局限性  J*a递归快速排序中静态变量导致数据累积问题的解决方案  汽车之家官方网站官网入口_汽车之家网页版直接进入  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  在WordPress中通过REST API获取BasicAuth保护的远程文章  Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注  蛙漫2台版漫画地址 Manwa2正版网页版链接  Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践  Python实现多节点属性重叠度分析教程  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升 

搜索