React 中的 Fragment 是个“隐形人”?你不知道的 <>...</> 的神秘力量!
·
一、什么是 Fragment?
如果你写过下面这样的 JSX:
function App() {
return (
<div>
<h1>Hello</h1>
<p>World</p>
</div>
);
}
你已经见识过 React 的 “只能返回一个根节点” 规则。为了让它合法,我们经常套个没用的 <div>,像是个“打包盒”。
但是你有没有想过,这个多余的 div:
- 会 污染 DOM 结构
- 会 影响 CSS 布局
- 可能让你的结构 语义变差
- 还 浪费性能
所以——React 给了我们一个“隐形的 div”:Fragment
二、Fragment 的两种写法
✨ 1. 标准写法(全名形式)
import React from 'react';
function App() {
return (
<React.Fragment>
<h1>Hello</h1>
<p>World</p>
</React.Fragment>
);
}
这和 div 看起来没什么区别,但神奇的是:它不会出现在最终的 DOM 中!
✨ 2. 简写形式(就是你看到的 <>...</>)
function App() {
return (
<>
<h1>Hello</h1>
<p>World</p>
</>
);
}
是的,这一对看起来像 Bug 的符号,其实是 React 的特性,它的名字是:Fragment 简写语法。
❗注意点:
<>...</>不能加属性(比如 key、className 都不行)- 如果你需要加 key,比如在
.map()中使用,请老老实实用标准写法:<React.Fragment key={...}>
三、Fragment 的实战使用场景
✅ 多元素返回的组件
function Info() {
return (
<>
<h2>姓名:阿强</h2>
<h3>爱好:Coding</h3>
</>
);
}
不需要多余的 div,就能让你代码更干净、更语义化!
✅ 列表渲染中的组合结构
const list = ['吃饭', '睡觉', '打代码'];
function TodoList() {
return (
<ul>
{list.map((item, index) => (
<React.Fragment key={index}>
<li>任务:{item}</li>
<li>状态:待完成</li>
</React.Fragment>
))}
</ul>
);
}
你想返回两个 <li>,但 <ul> 下不能直接 return 数组,于是用 Fragment 包起来,完美!
四、和原生 DOM 的联动理解:文档碎片(DocumentFragment)
在你理解 React Fragment 的时候,知道一点原生 DOM 的“碎片化渲染优化”是非常加分的,来看下面这段常见的 DOM 性能优化代码:
const container = document.getElementById('list');
const fragment = document.createDocumentFragment(); // 创建文档碎片
items.forEach(item => {
const wrapper = document.createElement('div');
const title = document.createElement('h3');
const desc = document.createElement('p');
title.textContent = item.title;
desc.textContent = item.content;
wrapper.appendChild(title);
wrapper.appendChild(desc);
fragment.appendChild(wrapper); // 所有操作都在内存中
});
container.appendChild(fragment); // 一次性挂载,提升性能
对应知识点解析:
| 概念 | 说明 |
|---|---|
| DocumentFragment | 是 DOM 的一个轻量“离线节点容器”,用来暂存一堆 DOM,不影响页面渲染 |
| createElement() | 创建真实 DOM 元素 |
| textContent | 安全设置文本,避免 innerHTML 带来的 XSS 问题 |
| 性能优化原理 | 避免频繁操作 DOM,只在最后统一插入,减少重排(Reflow)和重绘(Repaint) |
你可以把 Fragment 理解成 React 层的DocumentFragment:用来包裹多个节点、但不渲染额外结构。
五、Fragment 和 div 的区别总结
| 对比项 | div | Fragment(<>...</>) |
|---|---|---|
| 渲染到 DOM | ✅ 会渲染 | ❌ 不会渲染 |
| 是否增加嵌套层 | ✅ 会 | ❌ 不会 |
| 可否添加属性 | ✅ 可以 | ❌ 简写不行,标准才行 |
| 是否语义清晰 | ❌ 容易多余 | ✅ 更干净语义好 |
| 性能表现 | 多一个节点 | 更轻量更快 |
总结一波
一句话总结 Fragment:
<>...</> 是 React.Fragment 的简写,是 React 中“无标签的打包工具”,可以让你同时返回多个 JSX 元素,又不多加一层 div,让结构更优雅,性能更高效!
更多推荐
所有评论(0)