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

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

一、为什么要使用 <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.mzph.cn/pingmian/69736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java 面试 八股文】Redis篇

Redis 1. 什么是缓存穿透&#xff1f;怎么解决&#xff1f;2. 你能介绍一下布隆过滤器吗&#xff1f;3. 什么是缓存击穿&#xff1f;怎么解决&#xff1f;4. 什么是缓存雪崩&#xff1f;怎么解决&#xff1f;5. redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&…

第二天:工具的使用

每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中&#xff0c;对于爬虫有兴趣的伙伴可以订阅专栏一起学习&#xff0c;完全免费。 键盘为桨&#xff0c;代码作帆。这趟为期30天左右的Python爬虫特训即将启航&#xff0c;每日解锁新海域&#xff1a;从Requests库的…

MySQL8.0 innodb Cluster 高可用集群部署(MySQL、MySQL Shell、MySQL Router安装)

简介 MySQL InnoDB集群&#xff08;Cluster&#xff09;提供了一个集成的&#xff0c;本地的&#xff0c;HA解决方案。Mysq Innodb Cluster是利用组复制的 pxos 协议&#xff0c;保障数据一致性&#xff0c;组复制支持单主模式和多主模式。 InnoDB Cluster组件&#xff1a; …

Unity-Mirror网络框架-从入门到精通之LagCompensation示例

文章目录 前言什么是滞后补偿Lag Compensation示例延迟补偿原理ServerCubeClientCubeCapture2DSnapshot3D补充LagCompensation.cs 独立算法滞后补偿器组件注意:算法最小示例前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mir…

初窥强大,AI识别技术实现图像转文字(OCR技术)

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据、人工智能领域创作者。目前从事python全栈、爬虫和人工智能等相关工作&#xff0c;主要擅长领域有&#xff1a;python…

不小心删除服务[null]后,git bash出现错误

不小心删除服务[null]后&#xff0c;git bash出现错误&#xff0c;如何解决&#xff1f; 错误描述&#xff1a;打开 git bash、msys2都会出现错误「bash: /dev/null: No such device or address」 问题定位&#xff1a; 1.使用搜索引擎搜索「bash: /dev/null: No such device o…

k8s部署logstash

1. 编写logstash.yaml配置文件 --- apiVersion: v1 kind: Service metadata:name: logstash spec:type: ClusterIPclusterIP: Noneports:- name: logstash-tcpport: 5000targetPort: 5000- name: logstash-beatsport: 5044targetPort: 5044- name: logstash-apiport: 9600targ…

【JVM详解一】类加载过程与内存区域划分

一、简介 1.1 概述 JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关…

25考研电子信息复试面试常见核心问题真题汇总,电子信息考研复试没有项目怎么办?电子信息考研复试到底该如何准备?

你是不是在为电子信息考研复试焦虑&#xff1f;害怕被老师问到刁钻问题、担心专业面答不上来&#xff1f;别慌&#xff01;作为复试面试92分逆袭上岸的学姐&#xff0c;今天手把手教你拆解电子信息类复试通关密码&#xff01;看完这篇&#xff0c;让你面试现场直接开大&#xf…

【leetcode 32】1047. 删除字符串中的所有相邻重复项

Java中的queue、deque、ArrayDeque的区别 使用 Deque 作为堆栈(ArrayDeque是双端队列&#xff0c;当仅使用栈操作时push/pop&#xff0c;就是栈) class Solution {public String removeDuplicates(String s) {//使用 Deque 作为堆栈(ArrayDeque是双端队列&#xff0c;当仅使用栈…

redis项目

短信登录 这一块我们会使用redis共享session来实现 商户查询缓存 通过本章节&#xff0c;我们会理解缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩等问题&#xff0c;让小伙伴的对于这些概念的理解不仅仅是停留在概念上&#xff0c;更是能在代码中看到对应的内容 优惠…

Ubuntu 多版本 gcc 配置常用命令备忘

用的频率不高&#xff0c;总忘记具体参数 1&#xff0c;安装多版本 gcc 以 gcc-11 和12 为例&#xff1a; sudo apt-get install gcc-11 gcc-12 sudo apt-get install gcc-11 gcc-12 2&#xff0c;配置多版本 gcc gcc 与 g 一起配置进数据库中&#xff1a; sudo update-a…

【kubernetes组件合集】深入解析Kubernetes组件之三:client-go

深入解析Kubernetes组件之三&#xff1a;client-go 目录 深入解析Kubernetes组件之三&#xff1a;client-go 引言 1. client-go简介 2. client-go的功能 2.1 资源操作 2.2 资源监听 2.3 认证和授权 2.4 错误处理和重试 2.5 扩展性和定制化 3. 使用client-go与Kubern…

多项式插值(数值计算方法)Matlab实现

多项式插值&#xff08;数值计算方法&#xff09;Matlab实现 一. 原理介绍二. 程序设计1. 构建矩阵2. 求解矩阵方程3. 作出多项式函数4. 绘制插值曲线5. 完整代码 三. 图例 一. 原理介绍 关于插值的定义及基本原理可以参照如下索引 插值原理&#xff08;数值计算方法&#xff…

vite + axios 代理不起作用 404 无效

vite axios 代理不起作用 先看官方示例 export default defineConfig({server: {proxy: {// 字符串简写写法/foo: http://localhost:4567,// 选项写法/api: {target: http://jsonplaceholder.typicode.com,changeOrigin: true,rewrite: (path) > path.replace(/^\/api/, )…

国产编辑器EverEdit - 编辑辅助功能介绍

1 编辑辅助功能 1.1 各编辑辅助选项说明 1.1.1 行号 打开该选项时&#xff0c;在编辑器主窗口左侧显示行号&#xff0c;如下图所示&#xff1a; 1.1.2 文档地图 打开该选项时&#xff0c;在编辑器主窗口右侧靠近垂直滚动条的地方显示代码的缩略图&#xff0c;如下图所示&…

深入理解Java对接DeepSeek

其实&#xff0c;整个对接过程很简单&#xff0c;就四步&#xff0c;获取key&#xff0c;找到接口文档&#xff0c;接口测试&#xff0c;代码对接。 1.获取 KEY https://platform.deepseek.com/transactions 直接付款就是了&#xff08;现在官网暂停充值2025年2月7日&#xf…

调用DeepSeek官方的API接口

效果 前端样式体验链接&#xff1a;https://livequeen.top/deepseekshow 准备工作 1、注册deepseek官网账号 地址&#xff1a;DeepSeek 点击进入右上角【API开放平台】&#xff0c;并进行账号注册。 2、注册完成后&#xff0c;依次点击【API keys】-【生成API key】&#x…

香港中文大学 Adobe 推出 MotionCanvas:开启用户掌控的电影级图像视频创意之旅。

简介&#xff1a; 亮点直击 将电影镜头设计引入图像到视频的合成过程中。 推出了MotionCanvas&#xff0c;这是一种简化的视频合成系统&#xff0c;用于电影镜头设计&#xff0c;提供整体运动控制&#xff0c;以场景感知的方式联合操控相机和对象的运动。 设计了专门的运动条…

01.Docker 概述

Docker 概述 1. Docker 的主要目标2. 使用Docker 容器化封装应用程序的意义3. 容器和虚拟机技术比较4. 容器和虚拟机表现比较5. Docker 的组成6. Namespace7. Control groups8. 容器管理工具9. docker 的优缺点10. 容器的相关技术 docker 官网: http://www.docker.com 帮助文档…