Vue 3 借助 Fragment 完整实现了组件多根节点支持,这并不只是“可以写多个根标签”这么简单,而是覆盖虚拟 DOM 构建、diff 算法、挂载流程以及属性继承机制的一整套底层重构;编译器会自动生成 Fragment VNode,渲染器通过专门的 patch 流程保证子节点顺序稳定与高效复用,运行时还能自动处理非 props 属性继承,让开发者几乎无感地享受这一语法能力。

Vue 3 通过 Fragment 支持多个根节点,并不是单纯“放开多个标签”的限制,而是从虚拟 DOM 生成、diff 对比、挂载逻辑到 attrs 继承策略,整条渲染链路协同升级后的结果。
编译层自动识别并生成 Fragment VNode
当模板中同时存在多个同级根标签时,例如
渲染器专有 Patch 流程保障顺序与复用
Fragment 的 patch 更新流程会跳过普通元素常见的属性打补丁和文本设置,而是重点处理以下三件核心任务:
- 逐一 patch 子节点,按照新旧 children 数组的顺序进行 diff,对已有 DOM 节点执行复用、移动或卸载
- 整个过程不依赖额外父容器定位插入位置,而是通过 前一个兄弟节点的 DOM 元素作为 anchor 来精确确定挂载点
- 动态维护 fragment 实例的
anchor(首个子节点)和endAnchor(最后一个子节点),为后续更新提供稳定的边界锚点
运行时自动处理非 props 属性继承
父组件传入的 class、style、id 等未显式声明为 props 的属性,默认会自动合并到第一个子节点上;如果希望把这些属性明确传递给某个指定子节点,也可以使用 v-bind="$attrs" 手动分发,或者通过 inheritAttrs: false 关闭默认继承,改由开发者自行控制这套属性分配逻辑。这样一来,Vue 2 因单根节点限制而产生的属性归属模糊问题,也在 Vue 3 的 Fragment 方案中被一并优化解决。
开发者零感知的语法糖支持
开发时无需手动编写 return [h('div'), h('span')])中,Vue 3 都能原生兼容多根节点写法,无需额外插件或特殊配置。
看似不复杂却非常关键:Vue 3 Fragment 的真正价值,不只体现在语法层面的简洁,而在于它从底层把“无包裹容器的多节点协调”做成了可预测、可复用、可调试,并且可配合动画场景使用(结合 transition-group 时需注意限制)的一等公民能力。
