『React』Fragment的用法及简写形式
在 React 渲染组件时,每个组件只能返回一个根节点(root element)。传统上,如果我们需要渲染多条并列的元素,通常会使用一个多余的 <div>
或者其他容器标签将它们包裹起来。但是,这样会在最终的 HTML 中多生成一个无意义的节点,可能会影响样式、布局,甚至带来不必要的性能开销。
为了消除这种“无意义的包裹元素”,React 引入了 <Fragment>
组件。它 在渲染时不会生成额外的 DOM 节点,仅仅是一个“虚拟”容器,帮助我们在 JSX 中满足“只能返回一个根节点”的规则。它的本质只是 React 的一个内置组件,本身并不在 DOM 中出现。
Fragment 的用法
最直接的写法是直接从 React 库中导入 Fragment
,然后在 JSX 中如下使用:
import React, { Fragment } from 'react';function MyComponent() {return (<Fragment><h1>标题</h1><p>文字描述</p></Fragment>);
}
上面代码,组件返回了一个 <Fragment>
,内部包含多个并列元素;渲染到网页时并不会多出一个父级标签,而是直接渲染 <h1>
、<p>
、<ul>
三个元素。
如果你不想写 import { Fragment } from 'react'
,也可以直接使用全称:
import React from 'react';function MyComponent() {return (<React.Fragment><h1>标题</h1><p>这是一段描述文字。</p></React.Fragment>);
}export default MyComponent;
两者效果是完全一样的。
简写方式
从 React 16.2 开始,官方支持了 <Fragment>
的简写语法——空标签 <>...</>
,使用起来更简洁:
function MyComponent() {return (<><h1>标题</h1><p>这是一段描述文字。</p><ul><li>列表项 1</li><li>列表项 2</li></ul></>);
}
两者(<Fragment>...</Fragment>
与 <>...</>
)在渲染结果上没有区别。它们都不会在 DOM 中生成额外的节点。
注意: 空标签的简写语法 不能 使用 key
或其他属性,比如 <>
无法写成 < key="..." >
。如果需要给 Fragment 本身指定 key
,就必须使用完整写法 <Fragment key={...}>...</Fragment>
。
比如这种情况
import React from 'react';function TodoList({ todos }) {return (<ul>{todos.map((todo) => (<Fragment key={todo.id}><li>{todo.text}</li><li>状态:{todo.completed ? '已完成' : '未完成'}</li></Fragment>))}</ul>);
}
如果使用简写空标签 <>...</>
则无法指定 key
,会导致警告或无法正常做列表 Diff。因此在需要绑定 key
的场景下一定要使用 <Fragment key={...}>...</Fragment>
。
常见使用场景
组件返回多个并列节点
如果父级容器已足够,只想返回多条标签而不加冗余容器:
function ArticleSummary({ title, excerpt }) {return (<><h2>{title}</h2><p>{excerpt}</p></>);
}
表格中渲染多行
<table>
要求直接返回 <tr>
,不能多包一层 <div>
。<Fragment>
可把两行或多行当作一组处理:
import React, { Fragment } from 'react';function DataTable({ list }) {return (<table><tbody>{list.map(item => (<Fragment key={item.id}><tr><td>{item.name}</td><td>{item.value}</td></tr><tr><td colSpan="2">详情:{item.detail}</td></tr></Fragment>))}</tbody></table>);
}
条件渲染多节点
当一个条件下需要返回多条并列节点,用 Fragment 代替冗余父元素,更清爽:
function UserStatus({ user }) {return (<><h3>{user.name}</h3>{user.online ? <p>在线</p> : <p>离线</p>}</>);
}
与其他方式对比
多包一个 <div>
虽然能满足语法,但会产生额外节点,可能破坏 CSS 布局(如 Flex、Grid)或增深 DOM 层级。
返回数组
可以直接写数组返回多个元素,但每个元素都要写 key
,可读性差:
function Example() {return [<h1 key="title">标题</h1>,<p key="content">内容</p>,];
}
相比之下,Fragment 更简洁可读,且不用给内部每个元素都写 key
(只需给 Fragment 本身写一次)。
以上就是本文的全部内容了,如果本文对你有帮助的话请转发给你的工友~
想了解 React 的更多玩法,欢迎关注《React 中文教程》
相关文章:
『React』Fragment的用法及简写形式
在 React 渲染组件时,每个组件只能返回一个根节点(root element)。传统上,如果我们需要渲染多条并列的元素,通常会使用一个多余的 <div> 或者其他容器标签将它们包裹起来。但是,这样会在最终的 HTML …...
强化学习入门:交叉熵方法数学推导
前言 最近想开一个关于强化学习专栏,因为DeepSeek-R1很火,但本人对于LLM连门都没入。因此,只是记录一些类似的读书笔记,内容不深,大多数只是一些概念的东西,数学公式也不会太多,还望读者多多指教…...
CSS3 的特性
目录 CSS3 的特性CSS3 的三大特性1. 层叠性2. 继承性3. 优先级 CSS3 新增特性1. 选择器2. 盒模型3. 背景4. 渐变5. 过渡6. 动画7. 2D/3D 变换8. 弹性布局9. 网格布局10. 媒体查询11. 多列布局12. 文字阴影和盒子阴影 CSS3 的特性 CSS3 的三大特性 1. 层叠性 定义:…...
Vue前端篇——Vue 3的watch深度解析
📌 前言 在 Vue.js 的世界中,“数据驱动”是其核心理念之一。而在这一理念下,watch 扮演着一个非常关键的角色。它允许我们监听响应式数据的变化,并在其发生变化时执行特定的业务逻辑。 本文将通过实际代码示例,深入…...

行为型设计模式之Mediator(中介者)
行为型设计模式之Mediator(中介者) 1)意图 用一个中介对象来封装一系列的对象的交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 2)结构 其中ÿ…...

三维图形、地理空间、激光点云渲染技术术语解析笔记
三维图形、地理空间、激光点云渲染技术术语解析笔记 code review! 文章目录 三维图形、地理空间、激光点云渲染技术术语解析笔记1. Minecraft风格的方块渲染2. Meshing(网格化)3. Mipmapping(多级纹理映射)4. Marching Cubes&…...

从webrtc到janus简介
1.基础知识 1.1 信令的基础知识 在 WebRTC(Web Real-Time Communication) 中,信令(Signaling) 是实现浏览器之间实时通信的关键机制,负责在通信双方(或多方)之间传递控制信息&…...

JVM 核心概念深度解析
最近正在复习Java八股,所以会将一些热门的八股问题,结合ai与自身理解写成博客便于记忆 一、JVM内存结构/运行时数据区 JVM运行时数据区主要分为以下几个部分: 程序计数器(PC Register) 线程私有,记录当前线程执行的字节码行号唯…...

api将token设置为环境变量
右上角 可以新增或者是修改当前的环境 环境变量增加一个token,云端值和本地值可以不用写 在返回token的接口里设置后执行操作,通常是登录的接口 右侧也有方法提示 //设置环境变量 apt.environment.set("token", response.json.data.token); 在需要传t…...

SIFT算法详细原理与应用
SIFT算法详细原理与应用 1 SIFT算法由来 1.1 什么是 SIFT? SIFT,全称为 Scale-Invariant Feature Transform(尺度不变特征变换),是一种用于图像特征检测和描述的经典算法。它通过提取图像中的局部关键点,…...

AlphaDrive:通过强化学习和推理释放自动驾驶中 VLM 的力量
AlphaDrive: Unleashing the Power of VLMs in Autonomous Driving via Reinforcement Learning and Reasoning 25年3月来自华中科技大学和地平线的论文 OpenAI 的 o1 和 DeepSeek R1 在数学和科学等复杂领域达到甚至超越了人类专家水平,其中强化学习(R…...

【八股消消乐】如何解决SQL线上死锁事故
😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本专栏《八股消消乐》旨在记录个人所背的八股文,包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点ÿ…...

如何使用 HTML、CSS 和 JavaScript 随机更改图片颜色
原文:如何使用 HTML、CSS 和 JavaScript 随机更改图片颜色 | w3cschool笔记 (请勿标记为付费!!!!) 在网页开发中,为图片添加动态效果可以显著提升用户体验。今天,我将向…...
html如何在一张图片上的某一个区域做到点击事件
在HTML中,可以通过<map>和<area>标签来实现对图片的某个区域添加点击事件。这种方法通常用于创建图像地图(Image Map),允许用户点击图片的不同区域触发不同的事件。 以下是实现步骤和代码示例: 1. 准备图…...
Java数据校验:确保数据完整性和正确性
在软件开发中,数据校验是确保应用程序数据完整性和正确性的关键步骤。Java 提供了多种方式来实现数据校验,从简单的条件检查到复杂的框架支持。在这篇博客中,我们将探讨 Java 中数据校验的重要性、常用的校验注解以及如何整合校验框架来提高代…...
Java-IO流之序列化与反序列化详解
Java-IO流之序列化与反序列化详解 一、序列化与反序列化概述1.1 基本概念1.2 核心接口与类1.3 应用场景 二、Java序列化的基本实现2.1 实现Serializable接口2.2 使用ObjectOutputStream进行序列化2.3 使用ObjectInputStream进行反序列化 三、序列化的高级特性3.1 serialVersion…...
机器学习14-迁移学习
迁移学习学习笔记 一、迁移学习概述 迁移学习是机器学习中的一个重要领域,它旨在解决当目标任务的训练数据有限时,如何利用与目标任务相关但不完全相同的源任务数据来提高学习性能的问题。在现实世界中,获取大量高质量的标注数据往往成本高…...

CAN通信收发测试(USB2CAN模块测试实验)
1.搭建测试环境 电脑:安装 USB 驱动,安装原厂调试工具,安装cangaroo(参考安装包的入门教程即可) USB驱动路径:~\CAN分析仪资料20230701_Linux\硬件驱动程序 原厂调试工具路径:~\CAN分析仪资料2…...
小白初学SpringBoot记录
1.对于通过json返回用户信息时,需要忽略password字段操作: 1.1 pom配置jackson细节: <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>…...

OSCP备战-BSides-Vancouver-2018-Workshop靶机详细步骤
一、靶机介绍 靶机地址:https://www.vulnhub.com/entry/bsides-vancouver-2018-workshop%2C231/ 靶机难度:中级(CTF) 靶机发布日期:2018年3月21日 靶机描述: Boot2root挑战旨在创建一个安全的环境&…...

PDF转Markdown/JSON软件MinerU最新1.3.12版整合包下载
MinerU发布至今我已经更新多版整合包了,5天前MinerU发布了第一个正式版1.0.1,并且看到在18小时之前有更新模型文件,我就做了个最新版的一键启动整合包。 2025年02月21日更新v1.1.0版整合包 2025年02月27日更新v1.2.0版整合包 2025-06-05 更…...
Android第十三次面试总结基础
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

【深入学习Linux】System V共享内存
目录 前言 一、共享内存是什么? 共享内存实现原理 共享内存细节理解 二、接口认识 1.shmget函数——申请共享内存 2.ftok函数——生成key值 再次理解ftok和shmget 1)key与shmid的区别与联系 2)再理解key 3)通过指令查看/释放系统中…...

编程基础:执行流
能帮到你的话,就给个赞吧 😘 文章目录 执行流同步:顺序执行,只有一个执行流异步:新开后台(次)执行流,后台执行流要确保不能影响主执行流。共有两个执行流。 阻塞:任务阻塞执行流,导致…...

理解非结构化文档:将 Reducto 解析与 Elasticsearch 结合使用
作者:来自 Elastic Adel Wu 演示如何将 Reducto 的文档处理与 Elasticsearch 集成以实现语义搜索。 Elasticsearch 与业界领先的生成式 AI 工具和提供商有原生集成。欢迎观看我们的网络研讨会,了解如何超越 RAG 基础,或使用 Elastic 向量数据…...
算法训练第十天
232. 用栈实现队列 代码: class MyQueue(object):def __init__(self):self.arr1 []self.arr2 []def push(self, x):""":type x: int:rtype: None"""self.arr1.append(x)def pop(self):""":rtype: int""…...
2种官方方法关闭Windows防火墙
2种官方方法关闭Windows防火墙 引言一、防火墙:你电脑的"智能安检员"二、这些场景,可能需要"临时撤防"三、极速关闭方案方法一:通过系统设置(Win10/11专属通道)方法二:通过传统控制面板(全系统通用:Win7-11全系)四、 必读安全警告(关闭前请三思!…...

[面试精选] 0094. 二叉树的中序遍历
文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 94. 二叉树的中序遍历 - 力扣(LeetCode) 2. 题目描述 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 3. 题目示例 示例 1 : 输入&…...
股指期货期权交易规则是什么?
本文主要介绍股指期货期权交易规则是什么?股指期货期权是以股指期货合约为标的物的期权交易,其规则结合了期货与期权的特点。 股指期货期权交易规则是什么? 一、基础交易规则 交易时间 交易日9:30-11:30,13:00-15:00࿰…...

学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1]
学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1] 学习机器学习,需要学习如何预处理原始数据,这里用到pandas,将原始数据转换为张量格式的数据。 1、安装pandas pip install pandas 2、写入和读取数据 >>创建一个人工…...