React 第三十七节 Router 中 useOutlet Hook的使用介绍以及注意事项
React Router 中的 useOutlet 是 v6
版本新增的 Hook,用于在父路由组件中访问当前嵌套的子路由元素。它提供了比 <Outlet>
组件更灵活的控制方式,适合需要根据子路由状态进行动态处理的场景。
一、useOutlet的基本用法
import { useOutlet } from 'react-router-dom';function ParentLayout() {// 返回当前匹配的子路由元素(未匹配时返回 null)const outlet = useOutlet();return (<div><h1>Parent Layout</h1><nav>{/* 导航链接 */}</nav>{/* 等价于直接使用 <Outlet /> */}{outlet || <div>Default content when no sub-route matches</div>}</div>);
}
二、useOutlet的典型使用场景
2.1. 条件渲染布局
function AuthLayout() {const outlet = useOutlet();return (<div className="auth-layout">{outlet ? (// 有子路由时显示带背景的布局<div className="auth-background">{outlet}</div>) : (// 无子路由时显示默认内容<Navigate to="/login" />)}</div>);
}
2.2. 动态处理子路由
function AnimationLayout() {const outlet = useOutlet();const [prevOutlet, setPrevOutlet] = useState(outlet);// 保留旧路由用于退场动画if (outlet) setPrevOutlet(outlet);return (<AnimatePresence mode="wait"><motion.divkey={location.pathname}initial={{ opacity: 0 }}animate={{ opacity: 1 }}exit={{ opacity: 0 }}>{outlet || prevOutlet}</motion.div></AnimatePresence>);
}
三、useOutlet的路由配置示例
const router = createBrowserRouter([{path: '/',element: <ParentLayout />,children: [{path: 'dashboard',element: <Dashboard />,},{path: 'profile',element: <UserProfile />,}]}
]);
四、useOutlet的使用注意事项
4.1、上下文依赖
只能在被 <RouterProvider>
或 <BrowserRouter>
包裹的组件中使用,否则会抛出错误。
4.2、路由匹配规则
子路由需要正确配置在父路由的 children 数组中,且路径需要正确嵌套:
// ❌ 错误配置(缺少父路径)
children: [{ path: '/dashboard', ... }]// ✅ 正确配置
children: [{ path: 'dashboard', ... }] // 实际路径为 /dashboard
4.3、null 值处理
当没有匹配的子路由时返回 null,建议总是处理空状态:
// 推荐写法
{outlet || <FallbackComponent />}// 危险写法(可能渲染 undefined)
{outlet}
4.4、性能优化
与 <Outlet>
不同,直接使用 useOutlet
不会自动处理 Suspense
,需要自行添加错误边界:
function SafeOutlet() {const outlet = useOutlet();return <ErrorBoundary>{outlet}</ErrorBoundary>;
}
4.5、路由状态更新
当 URL 变化但父路由保持匹配时,useOutlet
会返回新的 React 元素,可以用 useLocation
监听变化:
const outlet = useOutlet();
const location = useLocation();useEffect(() => {console.log('Sub-route changed:', location.pathname);
}, [location]);
五、useOutlet 与 的对比
六、useOutlet 使用总结建议:
大多数简单场景直接使用 <Outlet>
更合适
需要以下高级功能时选择 useOutlet:
6.1、动态布局切换
6.2、路由过渡动画
6.3、自定义空状态处理
6.4、基于子路由的复杂条件渲染
相关文章:

React 第三十七节 Router 中 useOutlet Hook的使用介绍以及注意事项
React Router 中的 useOutlet 是 v6 版本新增的 Hook,用于在父路由组件中访问当前嵌套的子路由元素。它提供了比 <Outlet> 组件更灵活的控制方式,适合需要根据子路由状态进行动态处理的场景。 一、useOutlet的基本用法 import { useOutlet } fro…...
u-boot学习笔记(四)
文章目录 cmd/sub_cmd/exit.cdo_exit()exit.c可提供的命令及使用方式: ext2.cdo_ext2ls()do_ext2load()ext2.c可提供的命令及使用方式: ext4.cdo_ext4_size()do_ext4_load()do_ext4_ls()do_ext4_write()ext4.c可提供的命令及使用方式: fastbo…...
使用React实现调起系统相机功能
前言: 最近在公司推荐研发任务时实现了拍照识别功能,需要调起系统相机,笔者实现之后,将实现的流程分享给各位小伙伴 功能描述: 点击相机icon调起系统相机,同时可以选择是拍摄还是使用相册图片࿰…...
结构性变革与新兴机遇
近年来,全球就业市场正经历深刻的结构性变革。受技术进步、产业升级、人口结构变化及全球经济格局调整的影响,传统就业模式被重塑,新的职业机会不断涌现。本文将分析当前就业市场的主要趋势,并探讨其对劳动者、企业和政策制定者的…...

AGV通信第3期|AGV集群智能应急响应系统:从故障感知到快速恢复
随着智慧工厂物流系统复杂度的提升,AGV运行过程中的异常处理能力已成为保障生产连续性的关键指标。面对突发障碍、设备故障等意外状况,传统依赖人工干预的响应模式已无法满足现代智能制造对时效性的严苛要求。 一、AGV异常应急体系面临的挑战 响应时效瓶…...

军事目标无人机视角坦克检测数据集VOC+YOLO格式4003张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4003 标注数量(xml文件个数):4003 标注数量(txt文件个数):4003 …...
2025年5月AI科技领域周报(4.28-5.4):大模型商用加速落地 边缘AI开启全域智能新图景
2025年5月AI科技领域周报(4.28-5.4):大模型商用加速落地 边缘AI开启全域智能新图景 一、本周热点回顾1. OpenAI发布GPT-5多模态大模型 开启通用人工智能新纪元2. 谷歌发布安卓15系统 全面集成Gemini大模型重构移动生态3. 百度Apollo发布第六代…...
Flutter 3.29.3 花屏问题记录
文章目录 Flutter 3.29.3 花屏问题记录问题记录解决尝试解决 Flutter 3.29.3 花屏问题记录 问题记录 flutter版本3.29.3,代码大致为: ShaderMask(shaderCallback: (Rect bounds) {return LinearGradient(begin: Alignment.topCenter,end: Alignment.bo…...
【Pandas】pandas DataFrame all
Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 True pandas.DataFrame.all() pandas.DataFrame.all() 方…...

软件安全(二)优化shellcode
我们在上一节课中所写的shellcode,其中使用到的相关的API是通过写入其内存地址来实现调用。这种方法具有局限性,如切换其他的操作系统API的内存地址就会发生变化,从而无法正常调用。 所谓的shellcode不过是在目标程序中加一个区段使得程序可…...

RabbitMQ-运维
文章目录 前言运维-集群介绍多机多节点单机多节点 多机多节点下载配置hosts⽂件配置Erlang Cookie启动节点构建集群查看集群状态 单机多节点安装启动两个节点再启动两个节点验证RabbitMQ启动成功搭建集群把rabbit2, rabbit3添加到集群 宕机演示仲裁队列介绍raft算法协议 raft基…...

深度学习基础--目标检测常见算法简介(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN、SSD、YOLO)
博主简介:努力学习的22级本科生一枚 🌟;探索AI算法,C,go语言的世界;在迷茫中寻找光芒🌸 博客主页:羊小猪~~-CSDN博客 内容简介:常见目标检测算法简介…...
【Python 元组】
Python 中的元组(Tuple)是一种不可变的有序数据集合,用于存储多个元素的序列。与列表(List)类似,但元组一旦创建后无法修改,这种特性使其在特定场景下具有独特优势。 一、核心特性 不可变性&am…...

LINUX CFS算法解析
文章目录 1. Linux调度器的发展历程2. CFS设计思想3. CFS核心数据结构3.1 调度实体(sched_entity)3.2 CFS运行队列(cfs_rq)3.3 任务结构体中的调度相关字段 4. 优先级与权重4.1 优先级范围4.2 权重映射表 (prio_to_weight[])优先级计算4.3.1. static_prio (静态优先级)4.3.2. n…...
智能指针笔记
智能指针,利用class类对象销毁的时候自动调用析构函数,去把delete ptr的操作放在析构函数里,去实现自动释放指针里的资源 RAII是ResourceAcquisition Is Initialization的缩写,他是⼀种管理资源的类的设计思想,本质是 …...

软考-软件设计师中级备考 14、刷题 算法
一、考点归纳 1)排序 2、查找 3、复杂度 4、经典问题 0 - 1 背包动态规划0 - 1 背包问题具有最优子结构性质和重叠子问题性质。通过动态规划可以利用一个二维数组来记录子问题的解,避免重复计算,从而高效地求解出背包能装下的最大价值。分…...
Vue3 中 ref 与 reactive 的区别及底层原理详解
一、核心区别 1. 数据类型与使用场景 • ref 可定义基本类型(字符串、数字、布尔值)和对象类型的响应式数据。对于对象类型,ref 内部会自动调用 reactive 将其转换为响应式对象。 语法特点:需通过 .value 访问或修改数据&#…...
豆包:基于多模态交互的智能心理咨询机器人系统设计与效果评估——情感计算框架下的对话机制创新
豆包:基于多模态交互的智能心理咨询机器人系统设计与效果评估——情感计算框架下的对话机制创新 摘要 随着人工智能在心理健康领域的应用深化,本文提出一种融合情感计算与动态对话管理的智能心理咨询机器人系统架构。通过构建“用户状态-情感响应-策略生成”三层模型,结合…...

Baklib实战企业内容与中台管理差异解析
企业内容管理中台本质差异 企业内容管理系统(CMS)与内容中台的核心差异在于战略定位与技术路径的本质性区隔。传统CMS聚焦于内容存储与审批流程的线性管理,而内容中台则构建起全域数据服务中枢,通过API接口实现跨系统内容资产调用…...

通用外设驱动模型(四步法)
举例:GPIO配置步骤 1、使能时钟 __HAL_RCC_GPIOx_CLK_ENABLE()2、设置工作模式 HAL_GPIO_Init()3、设置输出状态(可选) HAL_GPIO_WritePin() HAL_GPIO_TogglePin()4、读取输入状态(可选) HAL_GPIO_ReadPin()模块…...

IoT无线组网模块,万物互联的底层通信基石
随着物联网(IoT)技术在“快车道”上持续飞驰,一场“交互革命”正在人们的日常出行与工作学习等生活场景中加速爆发。从智能家居到智慧城市,从智慧交通到工业自动化,物联网(IoT)技术凭借着万物互…...
Xterminal(或 X Terminal)通常指一类现代化的终端工具 工具介绍
Xterminal(或 X Terminal)通常指一类现代化的终端工具,旨在为开发者、运维人员提供更高效、更智能的命令行操作体验。 📢提示:文章排版原因,资源链接地址放在文章结尾👇👇ÿ…...
OpenCV 中用于支持 华为昇腾(Ascend)AI 芯片后端 的模块CANN
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cannops 是 OpenCV 中用于支持 华为昇腾(Ascend)AI 芯片后端 的模块,全称为 CANN Operations (CANN Operator…...

learning ray之ray强化学习/超参调优和数据处理
之前我们掌握了Ray Core的基本编程,我们已经学会了如何使用Ray API。现在,让我们将这些知识应用到一个更实际的场景中——构建一个强化学习项目,并且利用Ray来加速它。 我们的目标是,通过Ray的任务和Actor,将一个简单…...

【Linux】深入拆解Ext文件系统:从磁盘物理结构到Linux文件管理
目录 1、理解硬件 (1)磁盘 (2)磁盘的物理结构 (3)磁盘的存储结构 (4)磁盘的逻辑结构 (5)CHS && LBA地址 2、引入文件系统 (1&…...

基于 Ubuntu 24.04 部署 WebDAV
无域名,HTTP 1. 简介 WebDAV(Web Distributed Authoring and Versioning)是一种基于 HTTP 的协议,允许用户通过网络直接编辑和管理服务器上的文件。本教程介绍如何在 Ubuntu 24.04 上使用 Apache2 搭建 WebDAV 服务,无…...
人工智能基础知识笔记八:数据预处理
1、简介 在进行数据分析之前,数据预处理是一个至关重要的步骤。它包括了数据清洗、转换和特征工程等过程,以确保数据的质量并提高模型的性能。数据预处理是机器学习和数据分析中至关重要的步骤,其中分类变量的编码是核心任务之一。本文…...

tauri-plugin-store 这个插件将数据存在本地电脑哪个位置
tauri-plugin-store 插件用于在 Tauri 应用中以键值对形式持久化存储数据。它将数据存储在用户本地电脑的一个 JSON 文件中,具体路径取决于操作系统,并且通常位于操作系统的应用数据目录中。 默认存储位置 以默认配置为例(使用 default sto…...

一场陟遐自迩的 SwiftUI + CoreData 性能优化之旅(下)
概述 自从 SwiftUI 诞生那天起,我们秃头码农们就仿佛打开了一个全新的撸码世界,再辅以 CoreData 框架的鼎力相助,打造一款持久存储支持的 App 就像探囊取物般的 Easy。 话虽如此,不过 CoreData 虽好,稍不留神也可能会…...

数字人驱动/动画方向最新顶会期刊论文收集整理 | AAAI 2025
会议官方论文列表:https://ojs.aaai.org/index.php/AAAI/issue/view/624 以下论文部分会开源代码,若开源,会在论文原文的摘要下方给出链接。 语音驱动头部动画/其他 EchoMimic: Lifelike Audio-Driven Portrait Animations through Editabl…...