一文带你玩转Fragment文档碎片💡

153 阅读2分钟

什么是文档碎片(Document Fragment)?

💡 定义:

文档碎片(DocumentFragment)是一个轻量级的文档对象,它不是文档的一部分,不会触发页面的重绘或重排。

🧠 作用:

  • 用于批量操作 DOM
  • 减少页面的 重绘(Repaint)  和 重排(Reflow)
  • 提升页面性能,特别是在大量 DOM 插入时非常有用。

✅ 原生 JS 中的文档碎片使用

示例代码:

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); // 只触发一次重排

🧩 关键逻辑说明:

  • 创建 DocumentFragmentdocument.createDocumentFragment()
  • 将所有需要插入的 DOM 节点先添加到这个“临时容器”中;
  • 最后一次性将这个“容器”插入到页面中;
  • 这样可以避免每次插入节点都触发一次页面重排,提升性能。

 React 中的 <Fragment> 和 <></>

在 React 的 JSX 中,也有类似“文档碎片”的概念,用于包裹多个元素,而不会额外创建 DOM 节点

为什么不用<div></div>

<div></div>作为最外层父元素,DOM树多了一层不需要的节点,DOM解析性能下降,要多迭代一层

🔧 使用方式:

import { Fragment } from 'react';

function Demo() {
  return (
    <Fragment>
      <h1>Hello World</h1>
      <p>你好</p>
    </Fragment>
  );
}

或者使用语法糖:

function Demo() {
  return (
    <>
      <h1>Hello World</h1>
      <p>你好</p>
    </>
  );
}

解决的问题:

  • 在 JSX 中,不允许返回多个并列的根元素
  • 如果你直接写:
// ❌ 错误
function Demo() {
 return (
   <h1>Hello</h1>
   <p>你好</p>
 );
}

会报错:JSX expressions must have one parent element

所以我们用 <Fragment> 或 <></> 包裹这些元素,既满足 JSX 语法要求,又不会生成多余的 DOM 节点

与原生 DocumentFragment 的类比

对比点原生 JS(DocumentFragment)React(Fragment / <></>)
目的减少 DOM 操作带来的性能损耗避免无意义的 DOM 嵌套
是否渲染 DOM❌ 不渲染任何 DOM❌ 不渲染任何 DOM
使用方式document.createDocumentFragment()<Fragment> 或 <></>
主要用途批量插入 DOM 节点包裹多个 JSX 元素

📌 实际开发建议

  • 在原生 JS 中,如果你要一次性插入大量 DOM 元素,请使用 DocumentFragment 来优化性能;
  • 在 React 中,使用 <></> 或 <Fragment> 来包裹多个 JSX 元素,避免不必要的 div
  • 如果你使用的是 map 渲染多个元素,推荐在每个元素外包裹 <Fragment key={...}> ,这样既避免了 DOM 嵌套,又支持了 key
{items.map(item => (
 <Fragment key={item.id}>
   <h1>{item.title}</h1>
   <p>{item.content}</p>
 </Fragment>
))}

总结

文档碎片是一种优化 DOM 操作的手段,在原生 JS 中使用 DocumentFragment,在 React 中使用 <Fragment><></>,它们都能避免不必要的 DOM 嵌套和性能损耗,是构建高性能应用的重要技巧。