编译器将模板中的和v-slot在编译期转为渲染函数并绑定作用域数据;具名/作用域插槽被组织为$slots对象,父组件插槽内容编译为带参函数,运行时通过_renderslot动态调用并支持响应式与动态插槽名。

编译器处理动态插槽渲染,核心在于把模板中的 <slot></slot> 和 v-slot 指令,在编译阶段转化为可执行的渲染函数,并将插槽内容与作用域数据正确绑定。
编译阶段识别并提取插槽定义
Vue 编译器扫描子组件模板,遇到 <slot name="xxx"></slot> 时,会标记为具名插槽出口;遇到 <slot :data="item"></slot> 时,识别为作用域插槽,并收集绑定的数据字段(如 data)。这些信息最终被组织成一个插槽配置对象,挂载到组件的 $slots 上。
- 默认插槽对应
$slots.default - 具名插槽如
header对应$slots.header - 作用域插槽函数接收参数(如
{ data }),其返回值是 VNode 数组
父组件插槽内容转为函数而非节点
父组件中写的 <template>...</template> 不会在编译时生成真实 DOM 节点,而是被编译成一个带作用域参数的渲染函数。例如:
会被编译为类似:
一款AI工具,主要用于产品经理技能,适用于 Claude Code、Codex、Cursor 和 Windsurf。涵盖 SaaS 指标诊断、PRD 评审、路线图规划、需求探索,以及面向产品经理的职业转型辅导等,适合需要提升相关任务效率的用户。
这个函数在子组件 render 阶段才真正调用,确保能访问到子组件当前运行时的数据状态。
运行时动态匹配与调用
子组件执行 render 函数时,通过 _renderSlot($slots, "header") 或 _renderSlot($slots, "default", { label: 'Hello' }) 触发插槽函数执行。编译器已确保:
- 插槽函数内部能访问父组件作用域(词法作用域闭包)
- 传入的作用域参数来自子组件当前响应式数据(响应式追踪有效)
- 动态插槽名(如
v-slot:[name])在运行时解析后,仍能正确查找到对应插槽函数
动态插槽名与条件逻辑的处理
当使用 v-slot:[dynamicName] 或嵌套 v-if 时,编译器会保留表达式引用,不提前求值。运行时根据当前 dynamicName 的值去 $slots 中查找,若未定义则跳过或回退到默认插槽。条件逻辑(如 v-if="props.isAdmin")由插槽函数内部的渲染分支控制,不影响插槽注册本身。









