React 第二十五节 <Fragment></Fragment> 的用途以及使用注意事项详解

news/2025/2/13 8:19:55/

文章如果错误偏差,烦请及时批评指正

一、为什么要使用 <Fragment>

因为在 React 中,组件必须返回单个根元素。当我们尝试直接返回相邻的 JSX 元素时:

    function BrokenComponent() {return (<h1>标题</h1><p>正文内容</p>);}//  报错:Adjacent JSX elements must be wrapped in an enclosing tag

传统解决方案是使用

包裹,但这会带来 三大问题

1、破坏布局结构:多余的 DOM 节点可能干扰 CSS 布局(如 Flex/Grid)
2、性能损耗:增加无意义的 DOM 层级
3、语义污染:无关的

影响 HTML 语义化

二、基础用法:两种写法全解析

  1. 显式写法(推荐场景:需要 key 属性时)
    当我们遍历数组时,需要添加 key 属性时,我们需要显式的使用
import React, { Fragment } from 'react';
function ListItems() {return (<Fragment><li>第一项</li><li>第二项</li><li>第三项</li></Fragment>);
}
  1. 简写语法(空标签)
    function ShortSyntax() {return (<><h2>欢迎界面</h2><button>开始使用</button></>);}

三、实际开发过程中的应用场景

  1. 列表渲染(必须使用 key)
    function UserList({ users }) {return users.map(user => (<Fragment key={user.id}><dt>{user.name}</dt><dd>{user.email}</dd></Fragment>));}//  正确:Fragment 支持 key 属性//  错误:空标签语法 <></> 不能添加属性
  1. 条件渲染
    function AuthButton({ isLoggedIn }) {return (<Fragment>{isLoggedIn ? (<button>退出登录</button>) : (<Fragment><button>登录</button><button>注册</button></Fragment>)}</Fragment>);}
  1. 表格结构
    需要注意添加 标签的位置
    function TableData() {return (<table><tbody><tr><Fragment><td>单元格1</td><td>单元格2</td></Fragment></tr></tbody></table>);}// 注意:直接包裹 <tr> 会破坏表格结构
  1. 组合组件
    function Layout() {return (<><Header /><MainContent /><Footer /></>);}
  1. 高阶组件(HOC)
    const withLogger = (WrappedComponent) => {return (props) => (<Fragment><ConsoleLogger /><WrappedComponent {...props} /></Fragment>);};
  1. 渲染数组
    function ArrayRender() {return (<>{['A', 'B', 'C'].map((item) => (<Fragment key={item}><span>{item}</span><br /></Fragment>))}</>);}

四、深度原理剖析

源码实现(简化版):

    const Fragment = Symbol.for('react.fragment');function createFragment(children) {return {$$typeof: Symbol.for('react.element'),type: Fragment,props: { children },key: null};}

React 在调和(Reconciliation)阶段会:
识别 Fragment 类型
直接平铺其子节点
不创建真实 DOM 节点

五、开发者常遇到问题

1、样式丢失陷阱

// 错误示例:<div className="parent"><><Child style={{ margin: 10 }} /></></div>
// 正确:直接在父级设置样式容器 无脑简写导致 key 缺失
// 错误示例:{items.map(item => (<>  // 错误 缺少 key<span>{item.name}</span><span>{item.value}</span></>))}

2、多层 Fragment 嵌套

// 不良实践:
<><><ComponentA /><ComponentB /></><ComponentC />
</>
// 建议:单层 Fragment 保持结构清晰

3、与第三方库的冲突

    // 某些动画库(如 Framer Motion)需要真实 DOM:<motion.div><Fragment> //错误 动画失效{/* content */}</Fragment></motion.div>

4、开发工具调试困惑
Fragment 在 React DevTools 中显示为 ,可通过设置显示名称优化:

    const MyFragment = ({ children }) => <Fragment>{children}</Fragment>;MyFragment.displayName = 'MyFragment'; // 调试更友好

七、注意事项

1、优先使用空标签语法:<>...</> 简洁直观
2、需要 key 时切回显式 Fragment:列表项必须添加
3、避免深度嵌套:超过 3 层应考虑组件拆分,考虑组件的单一性易维护性
4、组件中需要结合 TypeScript 增加类型检查,避免使用人员传入不符合类型的数据

const FragmentWrapper: React.FC<{ children: React.ReactNode }> = ({ children }) => <>{children}</>;

5、性能敏感场景实测:大数据列表优先选择 Fragment
6、最后:当你在纠结是否使用 Fragment 时,先问自己两个问题:
这个容器是否需要任何样式或交互?
添加 DOM 节点是否会影响父级布局?
满足这两个条件,可以放心使用


http://www.ppmy.cn/news/1571654.html

相关文章

7. React Hooks

官方文档&#xff1a;https://zh-hans.react.dev/reference/react/hooks官方文档&#xff1a;https://zh-hans.legacy.reactjs.org/docs/hooks-intro.htmlRouter6 的一个中文文档&#xff1a;https://baimingxuan.github.io/react-router6-doc/react&#xff1a;版本 18.2.0nod…

基于轨道角动量自由度在空间频域中的可选择特性

将光的轨道角动量自由度应用到全息领域&#xff0c;证实了轨道角动量全息&#xff1b;实现了高维轨道角动量复用全息技术&#xff0c;获得了高安全的全息加密和超高容量全息信息系统。 1、轨道角动量自由度在全息中的引入 如图1所示&#xff0c;当全息图中没有携带轨道角动量的…

LeetCode刷题第4题【寻找两个正序数组的中位数】---解题思路及源码注释

LeetCode刷题第4题【寻找两个正序数组的中位数 】—解题思路及源码注释 结果预览 目录 LeetCode刷题第4题【寻找两个正序数组的中位数结果预览一、题目描述二、解题思路1、问题理解2、解题思路 三、代码实现及注释1、源码实现2、代码解释 四、执行效果1、时间和空间复杂度分析…

普通人怎样用好Deepseek?

DeepSeek R1由于超强的推理能力&#xff0c;可以赋能很多真实场景&#xff0c;比如编程、数学、数据分析、办公提效等&#xff0c;最近刚开工&#xff0c;打工人们都惊叹其解决问题的能力之强&#xff0c;失业恐慌之感油然而生&#xff0c;所以大家都在加紧在研究DeepSeek怎么帮…

DeepScaleR:仅用 1.5B 参数超越 OpenAI O1-Preview 的强化学习模型

1. 项目概述 1.1 项目目标与意义 DeepScaleR 项目旨在通过强化学习技术推动人工智能模型的性能提升&#xff0c;以更低的成本实现更优的推理能力。其核心目标是开发出在特定任务上超越现有模型的高效模型&#xff0c;同时为开源社区提供技术参考&#xff0c;促进技术的普惠和…

【橘子ES】Metric aggregations指标聚合

一、简介 上文我们说到了聚合的三类聚合&#xff0c;其中包括指标聚合。 Metric aggregations&#xff1a;指标聚合是根据字段值计算量度(如总和或平均值)的量度聚合。 此系列中的聚合基于以某种方式从正在聚合的文档中提取的值来计算度量。这些值通常从文档的字段中提取&…

Docker 安装指南:Windows、Mac、Linux

Docker 是一种非常流行的容器化平台&#xff0c;用于开发、部署和运行应用程序。它通过容器的方式使得应用程序与其依赖环境一同打包并在不同环境中一致地运行。在本篇文章中&#xff0c;我们将介绍如何在 Windows、Mac 和 Linux 上安装 Docker。 1. Docker 安装前的准备工作 …

关于 IoT DC3 中位号(Point)的理解

在开源IoT DC3物联网系统中&#xff0c;位号&#xff08;Point&#xff0c;有的系统也叫Tag、Variable、Node、Signal等&#xff09;用于数据采集、状态监测和报警管理。 位号数据可以通过 PLC、传感器或数据采集模块读取&#xff0c;并存储在数据库或云端&#xff0c;以供进一…