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


在 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 作为子路由。

度加剪辑 度加剪辑

度加剪辑(原度咔剪辑),百度旗下AI创作工具

度加剪辑 359 查看详情 度加剪辑

修改前的 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 属性是相对于其父路由的。例如,} />)。
  3. 以上就是在 React Router 中利用 Outlet 实现组件嵌套渲染的详细内容,更多请关注其它相关文章!


    # react  # 如果你  # 这一  # 是一个  # 复选框  # 引入了  # 如何实现  # 移除  # 将在  # 组件渲染  # 路由  # ai  # app  # js  # html  # css  # 相对于  # 电话seo优化服务保障  # 青岛网站建设推广费用  # 百润营销推广怎么样  # 二维码营销推广法是什么  # 白帽SEO营销软件  # 推广营销合同的付款方式  # 一屏seo视频教学  # 香水产品推广营销策划书  # 网站eos优化  # 如何整合推广渠道营销  # 在这里 


    相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


    相关推荐: 如何在Python中安全地将环境变量转换为整数并满足Mypy类型检查  使用 J*aScript 随机化 CSS Grid 布局中的元素顺序  cad加载的线型看不见怎么办_cad线型不可见问题解决方法  电脑的“恢复环境(WinRE)”找不到怎么办_Windows系统恢复环境重建【高级修复】  抖音如何解除|直播|权限绑定_抖音关闭并解绑|直播|功能的方法  手机坏了微信聊天记录怎么导出来 新手机恢复聊天记录技巧  偃武诸葛亮阵容搭配推荐  酷狗音乐多音轨设置教程  Final Cut Pro视频加EQ教程  嘀嗒顺风车如何开具电子发票  windows server2019显卡驱动怎么安装_winserver2019显卡驱动安装与远程桌面优化  电脑双系统如何安装和卸载 Windows和Linux双系统安装教程【详解】  支付宝网页版在线入口 支付宝官网电脑登录入口  J*aScript桌面应用_Electron多进程架构实战  Highcharts雷达图轴线交点数值标注指南  如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?  火狐浏览器如何刷新修复浏览器 火狐浏览器“重置Firefox”功能详解  《edge浏览器》关闭翻译功能方法  J*aScript深度克隆:实现高效、健壮与安全的复杂对象复制  学习通网页版课程打不开_课程无法访问时的解决方法  《单词速记宝》设置学习计划方法  外卖小程序对接第三方配送  快递物流路径揭秘  管理打开的编辑器:固定、分组和关闭技巧  Python类装饰器动态修改方法时的类型提示:Mypy插件实现精确静态分析  钉钉任务无法提醒如何处理 钉钉任务提醒优化方法  Mac如何开启画中画模式_Mac Safari浏览器视频画中画功能  如何在Podman容器中运行Composer_Docker替代品Podman的PHP与Composer容器化实践  猫眼电影app如何参与官方的抽奖活动_猫眼电影官方抽奖参与方法  ao3入口镜像地址 ao3镜像入口可靠跳转  C++中的explicit关键字有什么作用_C++类型转换控制与explicit使用  Apple Music无故扣费引质疑  邮政快递寄件查询入口 邮政快递收件查询入口  Magento 2 产品保存事件中安全更新属性的最佳实践  《糖豆》添加舞曲方法  Windows自带的便笺数据如何备份_防止数据丢失的便利贴迁移教程【干货】  哈尔滨城市通昵称修改方法  Fedora怎么安装 Fedora Workstation安装步骤  Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南  发博客与长微博技巧  Win10共享文件夹设置方法 Win10局域网文件共享全攻略【教程】  CSS如何使用outline-offset与颜色组合突出元素边框  Excel如何制作月度销售统计图_Excel动态图表制作与控件应用  TikTok笔记文字无法编辑如何解决 TikTok笔记文字编辑优化方法  Win11如何分屏操作_Win11多窗口分屏技巧  支付宝如何解绑云闪付_支付宝与云闪付账户关联解除方法  Composer reinstall命令重装损坏的包  《雷电模拟器》截图方法介绍  QQ网页版入口导航 QQ网页版在线访问通道  苹果手机缓存怎么清除_苹果手机缓存如何清除iphone各版本操作步骤 

     2025-11-03

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.