当前位置:首页 > 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。
  • 作用域插槽在子组件更新时重新调用插槽函数,但函数本身只有在父组件更新时才会变化。

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

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

相关文章

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:CSS…

vue cli实现原理

vue cli实现原理

Vue CLI 的实现原理 Vue CLI 是一个基于 Node.js 的工具链,用于快速搭建 Vue.js 项目。其核心实现原理涉及模块化设计、插件系统、Webpack 封装等多个方面。 核心模块…

vue插件实现原理

vue插件实现原理

Vue 插件实现原理 Vue 插件的核心是通过暴露一个 install 方法,在 Vue 应用初始化时被调用,从而扩展 Vue 的功能。插件可以添加全局方法、指令、混入、组件等。 插件基本结构 一个…

vue底层原理实现

vue底层原理实现

Vue 底层原理实现 Vue.js 的核心原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是其底层实现的关键点: 响应式系统 Vue 2.x 使用 Object.defineProp…

vue 组件实现原理

vue 组件实现原理

Vue 组件实现原理 Vue 组件的实现原理主要基于以下几个核心机制: 组件注册与定义 Vue 组件可以通过 Vue.component 全局注册或局部注册。组件定义通常包含模板(template)…

vue实现mvvm原理

vue实现mvvm原理

Vue 实现 MVVM 的原理 Vue 的 MVVM(Model-View-ViewModel)实现主要依赖于数据绑定和响应式系统。以下是其核心原理的详细解析: 数据劫持(响应式系统) Vue 通过…