Fragment 允许你在不添加额外 DOM 节点的情况下对元素进行分组。

示例 1: 基本用法

❌ 使用 div 包装(产生额外节点)

使用 div 包装额外的 DOM 节点

✅ 使用 Fragment(无额外节点)

使用 Fragment无额外 DOM 节点
// ❌ 使用 div - 产生额外 DOM
function WithDiv() {
  return (
    <div>
      <span>元素1</span>
      <span>元素2</span>
    </div>
  );
}

// ✅ 使用 Fragment - 无额外 DOM
function WithFragment() {
  return (
    <>
      <span>元素1</span>
      <span>元素2</span>
    </>
  );
}

示例 2: 定义列表

React
用于构建用户界面的 JavaScript 库
JSX
JavaScript 的语法扩展,类似 HTML
Component
可复用的 UI 构建块
Props
父组件传递给子组件的数据
// 定义列表需要 dt 和 dd 是 dl 的直接子元素
function GlossaryItem({ term, definition }) {
  return (
    <Fragment key={id}>
      <dt>{term}</dt>
      <dd>{definition}</dd>
    </Fragment>
  );
}
说明: 在列表渲染中使用 Fragment 时, 必须使用显式的 <Fragment key={id}> 语法来传递 key。

示例 3: 表格中的 Fragment

姓名邮箱角色
张三zhang@example.com管理员
李四li@example.com用户
王五wang@example.com编辑
// 表格列组件返回多个 td
function TableColumns({ user }) {
  return (
    <>
      <td>{user.name}</td>
      <td>{user.email}</td>
      <td>{user.role}</td>
    </>
  );
}

示例 4: Flex 布局

✅ 使用 Fragment(正确的 flex 布局)

1
2
3

❌ 使用 div 包装(布局被破坏)

1
2
3
注意: 在 Flex 容器中,额外的 div 会成为唯一的 flex item,破坏预期的布局。

示例 5: 条件渲染

张三

{showDetails && (
  <>
    <p>{bio}</p>
    <p>{address}</p>
  </>
)}

{showContact && (
  <>
    <p>📧 {email}</p>
    <p>📱 {phone}</p>
  </>
)}

示例 6: 两种语法对比

简写语法 <>...</>

标题

副标题

适用于:不需要 key 的场景

显式语法 <Fragment key=...>

项目 1
描述 1
项目 2
描述 2
项目 3
描述 3

适用于:列表渲染需要 key

// 简写语法 - 不能传递 key
<>
  <Child1 />
  <Child2 />
</>

// 显式语法 - 可以传递 key
<Fragment key={id}>
  <Child1 />
  <Child2 />
</Fragment>