当前位置:首页 > VUE

vue插槽实现原理

2026-01-19 22:25:09VUE

Vue 插槽的实现原理

Vue 插槽(Slot)的核心原理是基于编译时的模板转换和运行时的作用域处理。插槽允许父组件向子组件传递模板片段,子组件通过插槽出口(<slot>)渲染这些内容。

编译阶段处理

Vue 的模板编译器会将插槽相关语法转换为渲染函数代码:

  • 父组件中通过 v-slot 或默认插槽传递的内容会被编译为函数形式,保存在子组件的 $slots$scopedSlots 中。
  • 子组件中的 <slot> 标签会被编译为对 $slots$scopedSlots 的调用。

例如以下父组件模板:

<child-component>
  <template v-slot:default>插槽内容</template>
</child-component>

会被编译为类似:

vue插槽实现原理

h('child-component', {
  scopedSlots: {
    default: () => '插槽内容'
  }
})

运行时处理

在子组件实例化时:

  • 普通插槽内容会被挂载到 vm.$slots,作用域在父组件中确定。
  • 作用域插槽内容会被挂载到 vm.$scopedSlots,以函数形式接收子组件传递的数据。

子组件的 <slot> 会被转换为对 $slots 的调用:

vue插槽实现原理

// 编译后的渲染函数
render(h) {
  return h('div', this.$slots.default)
}

作用域插槽实现

作用域插槽允许子组件向插槽传递数据,编译后会生成接收参数的函数:

<!-- 父组件 -->
<child-component>
  <template v-slot:default="slotProps">{{ slotProps.text }}</template>
</child-component>

<!-- 子组件 -->
<slot :text="message"></slot>

编译后的代码类似:

// 父组件渲染函数
h('child-component', {
  scopedSlots: {
    default: (props) => props.text
  }
})

// 子组件渲染函数
h('div', this.$scopedSlots.default({ text: this.message }))

更新机制

当插槽内容依赖响应式数据时:

  • 普通插槽在父组件更新时重新生成整个 VNode。
  • 作用域插槽在子组件更新时重新调用插槽函数,但函数本身只有在父组件更新时才会变化。

这种设计保证了性能优化,避免不必要的重新渲染。

标签: 插槽原理
分享给朋友:

相关文章

vue原理实现

vue原理实现

Vue 的核心原理实现 Vue 的核心原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是这些核心原理的具体实现方式: 响应式系统 Vue 的响应式系统基于 Object.define…

eventbus实现原理vue

eventbus实现原理vue

EventBus 实现原理 EventBus 在 Vue 中通常用于跨组件通信,其核心原理基于发布-订阅模式。通过一个中央事件总线,组件可以订阅事件或触发事件,实现非父子组件间的通信。 核心机制 E…

vue watch 实现 原理

vue watch 实现 原理

Vue Watch 实现原理 Vue 的 watch 功能用于监听数据变化并执行回调函数。其核心原理基于 Vue 的响应式系统,依赖 Object.defineProperty 或 Proxy(Vue…

vue分页实现原理

vue分页实现原理

Vue 分页实现原理 Vue 分页的核心原理是通过计算当前页的数据范围,动态渲染数据列表并控制分页组件的交互。以下是关键实现步骤: 数据分片计算 分页需要根据当前页码和每页条数截取数据。假设原始数据…

vue set实现原理

vue set实现原理

Vue.set 的实现原理 Vue.set 是 Vue.js 提供的一个全局 API,用于向响应式对象添加新属性并确保其也是响应式的。其核心原理基于 Vue 的响应式系统实现。 响应式系统基…

uniapp插槽样式

uniapp插槽样式

uniapp插槽样式的基本用法 在UniApp中使用插槽时,样式处理与普通组件类似,但需要注意作用域问题。父组件传递内容到子组件插槽时,样式默认受父组件作用域影响。 子组件中定义插槽: <v…