当前位置:首页 > VUE

vue插槽怎么实现的

2026-02-23 18:43:52VUE

Vue 插槽的实现方式

Vue 插槽(Slot)是一种内容分发机制,允许父组件向子组件传递模板片段。以下是插槽的核心实现方式:

默认插槽

子组件通过 <slot> 标签定义插槽位置,父组件传递的内容会替换该标签。若父组件未提供内容,则显示 <slot> 内的默认内容。

<!-- 子组件 Child.vue -->
<template>
  <div>
    <slot>默认内容</slot>
  </div>
</template>

<!-- 父组件 -->
<Child>
  <p>替换默认内容</p>
</Child>

具名插槽

通过 name 属性为插槽命名,实现多插槽内容分发。父组件使用 v-slot 指令或 # 缩写指定插槽名。

<!-- 子组件 Layout.vue -->
<template>
  <div>
    <header><slot name="header"></slot></header>
    <main><slot></slot></main>
  </div>
</template>

<!-- 父组件 -->
<Layout>
  <template #header>
    <h1>标题</h1>
  </template>
  <p>主内容</p>
</Layout>

作用域插槽

子组件通过插槽属性向父组件传递数据,父组件通过 v-slot 接收数据。

<!-- 子组件 ScopedSlot.vue -->
<template>
  <ul>
    <li v-for="item in items" :key="item.id">
      <slot :item="item"></slot>
    </li>
  </ul>
</template>

<!-- 父组件 -->
<ScopedSlot :items="list">
  <template v-slot="{ item }">
    <span>{{ item.text }}</span>
  </template>
</ScopedSlot>

动态插槽名

通过动态指令参数绑定插槽名,实现灵活的内容分发。

<template>
  <Child>
    <template #[dynamicSlotName]>
      动态内容
    </template>
  </Child>
</template>

插槽原理

Vue 在编译阶段会将插槽内容转化为函数,子组件通过调用这些函数渲染内容。作用域插槽本质上是向函数传递参数。虚拟 DOM 比对时,插槽内容会被视为子组件的子节点。

vue插槽怎么实现的

注意事项

  • 插槽内容在父组件作用域编译,但作用域插槽可访问子组件数据。
  • v-slot 只能用于 <template> 或组件标签。
  • Vue 3 统一了 slotslot-scope 语法为 v-slot

标签: 插槽vue
分享给朋友:

相关文章

vue的实现

vue的实现

Vue 的实现原理 Vue 是一个渐进式 JavaScript 框架,其核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是 Vue 实现的主要技术细节。 响应式系统 Vue 的响…

vue 实现图钉

vue 实现图钉

实现图钉效果的步骤 在Vue中实现图钉(固定位置)效果,可以通过CSS的position: sticky属性或监听滚动事件动态修改元素样式。以下是两种常见方法: 方法一:使用CSS的posi…

vue排他思想实现

vue排他思想实现

Vue 排他思想实现 排他思想在 Vue 中通常指多个元素中只能有一个被选中或激活的状态。可以通过数据驱动和条件渲染实现。 使用 v-model 和计算属性 定义一个数据属性存储当前选中项的索引或标…

vue实现抽奖轮盘

vue实现抽奖轮盘

实现抽奖轮盘的基本思路 使用Vue实现抽奖轮盘的核心在于动态旋转动画和结果判定。通常需要结合CSS动画或JavaScript动画库(如GSAP)控制轮盘的旋转角度,并通过随机数或后端接口确定最终奖项。…

vue实现流程转化

vue实现流程转化

Vue 实现流程转化 在 Vue 中实现流程转化通常涉及多个步骤,包括状态管理、组件通信和动态渲染。以下是几种常见的实现方法: 使用 Vuex 进行状态管理 Vuex 是 Vue 的官方状态管理库,…

vue实现左右布局

vue实现左右布局

实现左右布局的方法 在Vue中实现左右布局可以通过多种方式完成,以下是几种常见的方法: 使用Flexbox布局 Flexbox是一种现代的CSS布局方式,可以轻松实现左右布局。 <t…