当前位置:首页 > 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 列表实现方法 使用 v-for 指令 v-for 是 Vue 中用于渲染列表的核心指令,基于数据源动态生成 DOM 元素。语法格式为 item in items 或 (item, index)…

vue分类实现

vue分类实现

Vue分类实现方法 在Vue中实现分类功能通常涉及数据分组、动态渲染和交互逻辑。以下是几种常见的实现方式: 基于计算属性的分类 通过计算属性对原始数据进行分组处理,适合静态或少量数据分类: com…

vue实现markdown

vue实现markdown

Vue 实现 Markdown 编辑器 在 Vue 中实现 Markdown 编辑器可以通过集成第三方库或自定义解析器完成。以下是两种常见方法: 使用第三方库(如 marked 或 markdown…

通过vue实现

通过vue实现

Vue 实现方法 安装 Vue 确保已安装 Node.js 和 npm,通过以下命令安装 Vue CLI: npm install -g @vue/cli 创建 Vue 项目 使用 Vue CLI…

vue 实现表单

vue 实现表单

Vue 表单实现方法 Vue.js 提供了多种方式实现表单,包括双向数据绑定、表单验证和动态表单生成。以下是常见的实现方法: 基础表单绑定 使用 v-model 指令实现表单元素与数据的双向绑定:…

vue动画实现

vue动画实现

Vue动画实现方法 Vue提供了多种方式实现动画效果,主要通过内置组件和第三方库完成。 使用<transition>组件 Vue内置的<transition>组件可以为元素添…