Vue的Diff算法处理插槽更新时,关键在于父组件控制子组件的slots引用变更,触发子组件重新渲染并执行自身差异对比。

作为函数式内容,插槽(如slots.default)在父组件render阶段被调用生成VNode。当父组件的响应式依赖发生变化时,包括v-if条件切换、v-for数据更新或作用域插槽props变动,都会触发父组件重新render并生成新的插槽VNode数组。
slots引用发生改变(即使内容相同),Vue即判定插槽需要更新插槽更新严格遵循父组件优先于子组件的处理顺序:
updateComponentPreRender更新子实例的props和slotsrender()生成新VNode后,才开始执行子组件内部的children差异对比示例场景:父组件包含<Child><p>{{ msg }}</p></Child>模板时:
slots.default函数→生成新的<p>...</p>VNode数组<slot></slot>展开为新VNode→进入子组件自身的patchChildren流程作用域插槽(如v-slot:item="{ data }")本身不含key,但当其位于v-for循环中时,父级会为每个循环项生成带key的slotVNode。
slots的组成部分传入,key值保留在生成的VNode上patchKeyedChildren,利用key实现精准节点复用和位置调整插槽内容的DOM生成完全由父组件render流程控制,与子组件生命周期无关:
created阶段:父组件render尚未执行,slots可能为空或仅含默认内容,且无真实DOMmounted阶段:父组件已完成patch,子组件完成首次render,插槽内容已挂载至子组件DOMonMounted和nextTick确保渲染完成Vue的插槽更新机制通过父子组件协同工作,确保动态内容的高效渲染和精确更新。