技术文档中心
首页
React
Vue
TypeScript
Kotlin
React Native
Electron
Android
首页
React
Vue
TypeScript
Kotlin
React Native
Electron
Android
  • Vue2 基础

    • Vue 学习指南
    • Vue2 快速入门
    • Vue2 模板语法
    • Vue2 组件基础
    • Vue2 计算属性与侦听器
    • Vue2 生命周期
  • Vue2 进阶

    • Vue2 组件通信
    • Vue2 插槽详解
    • Vue2 混入与自定义指令
    • Vue2 过渡与动画
    • Vuex 状态管理
  • Vue2 高级

    • Vue2 性能优化
    • Vue2 服务端渲染(SSR)
    • Vue2 源码解析
  • Vue3 基础

    • Vue3 快速入门
    • Vue3 Composition API
    • Vue3 响应式系统
    • Vue3 组件基础
    • Vue3 生命周期
  • Vue3 进阶

    • Vue3 组合式函数
    • Vue3 组件通信
    • Vue3 Teleport 与 Suspense
    • Pinia 状态管理
    • Vue Router 4
  • Vue3 高级

    • Vue3 TypeScript
    • Vue3 性能优化
    • Vue3 测试
    • Vue3 SSR
    • Vue3 源码解析
  • 实战项目

    • Vue2 实战项目
    • Vue3 实战项目
    • Vue2 迁移 Vue3

Vue2 插槽详解

默认插槽

<!-- 子组件 -->
<div class="container">
  <slot>默认内容</slot>
</div>

<!-- 父组件 -->
<my-component>
  <p>插槽内容</p>
</my-component>

具名插槽

<!-- 子组件 -->
<div class="container">
  <header>
    <slot name="header"></slot>
  </header>
  <main>
    <slot></slot>
  </main>
  <footer>
    <slot name="footer"></slot>
  </footer>
</div>

<!-- 父组件 -->
<base-layout>
  <template v-slot:header>
    <h1>标题</h1>
  </template>

  <p>主要内容</p>

  <template v-slot:footer>
    <p>底部信息</p>
  </template>
</base-layout>

<!-- 缩写 -->
<base-layout>
  <template #header>
    <h1>标题</h1>
  </template>
</base-layout>

作用域插槽

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

<!-- 父组件 -->
<my-list :items="items">
  <template v-slot:default="slotProps">
    <span>{{ slotProps.item.name }}</span>
  </template>
</my-list>

<!-- 解构插槽 Prop -->
<my-list :items="items">
  <template v-slot:default="{ item, index }">
    <span>{{ item.name }}</span>
  </template>
</my-list>

动态插槽名

<base-layout>
  <template v-slot:[dynamicSlotName]>
    动态插槽内容
  </template>
</base-layout>

实际应用

列表组件

<!-- ListComponent.vue -->
<template>
  <ul class="list">
    <li v-for="item in items" :key="item.id" class="list-item">
      <slot :item="item">
        {{ item.name }}
      </slot>
    </li>
  </ul>
</template>

<!-- 使用 -->
<list-component :items="users">
  <template #default="{ item }">
    <div class="user-card">
      <img :src="item.avatar" />
      <span>{{ item.name }}</span>
    </div>
  </template>
</list-component>

表格组件

<!-- TableComponent.vue -->
<template>
  <table>
    <thead>
      <slot name="header"></slot>
    </thead>
    <tbody>
      <tr v-for="row in data" :key="row.id">
        <slot :row="row"></slot>
      </tr>
    </tbody>
  </table>
</template>

<!-- 使用 -->
<table-component :data="tableData">
  <template #header>
    <tr>
      <th>姓名</th>
      <th>年龄</th>
    </tr>
  </template>
  <template #default="{ row }">
    <td>{{ row.name }}</td>
    <td>{{ row.age }}</td>
  </template>
</table-component>
最近更新: 2026/1/27 15:51
Contributors: hailong
Prev
Vue2 组件通信
Next
Vue2 混入与自定义指令