第9篇:插槽(Slots)的使用

目标:掌握组件内容分发的灵活方式


1. 默认插槽(匿名插槽)
html 复制代码
<!-- 子组件 Layout.vue -->  
<template>  
  <div class="container">  
    <header>  
      <slot></slot>  <!-- 内容插入点 -->  
    </header>  
  </div>  
</template>  

<!-- 父组件使用 -->  
<Layout>  
  <h1>这是插入的标题内容</h1>  
</Layout>  
复制代码

关键点

  • <slot> 标签定义内容占位符

  • 父组件传入的内容会替换子组件的 <slot>


2. 具名插槽
html 复制代码
<!-- 子组件 Card.vue -->  
<template>  
  <div class="card">  
    <slot name="header"></slot>  
    <slot name="content"></slot>  
    <slot name="footer"></slot>  
  </div>  
</template>  

<!-- 父组件使用 -->  
<Card>  
  <template v-slot:header>  
    <h2>卡片标题</h2>  
  </template>  

  <template #content>  <!-- 简写语法 -->  
    <p>卡片正文内容...</p>  
  </template>  

  <template #footer>  
    <button>确认</button>  
  </template>  
</Card>  
复制代码

语法说明

  • v-slot:name 或简写 #name 指定插槽名称

  • 未命名的 <template> 内容会填充到默认插槽


3. 作用域插槽(向父组件传递数据)
html 复制代码
<!-- 子组件 TodoList.vue -->  
<template>  
  <ul>  
    <li v-for="todo in todos" :key="todo.id">  
      <slot :todo="todo"></slot>  
    </li>  
  </ul>  
</template>  

<!-- 父组件使用 -->  
<TodoList :todos="todoList">  
  <template #default="slotProps">  
    <span :class="{ done: slotProps.todo.isDone }">  
      {{ slotProps.todo.text }}  
    </span>  
  </template>  
</TodoList>  
复制代码

关键点

  • 子组件通过 <slot :data="value"> 传递数据

  • 父组件通过 #slotName="props" 接收数据


4. 插槽默认内容
html 复制代码
<!-- 子组件 Button.vue -->  
<template>  
  <button class="btn">  
    <slot>提交</slot>  <!-- 父组件不传内容时显示"提交" -->  
  </button>  
</template>  
复制代码

5. 动态插槽名(Vue3新特性)
html 复制代码
<template>  
  <Component>  
    <template #[dynamicSlotName]>  
      动态插槽内容  
    </template>  
  </Component>  
</template>  

<script setup>  
const dynamicSlotName = ref('header')  
</script>  

6. 插槽实战场景
  1. 布局组件:定义页面的通用结构(Header/Content/Footer)

  2. UI组件库:Table组件的自定义单元格渲染

  3. 高阶组件:通过作用域插槽传递业务数据


最佳实践

  • 复杂组件优先使用具名插槽

  • 避免在插槽内容中直接修改子组件状态

  • 作用域插槽适合需要定制渲染逻辑的场景

相关推荐
傅里叶3 分钟前
Flutter在OrangePi 5 Plus上视频播放锁死问题
前端·flutter
古夕37 分钟前
my-first-ai-web_问题记录03——NextJS 项目框架基础扫盲
前端·javascript·react.js
曲意已决1 小时前
《深入源码理解webpac构建流程》
前端·javascript
去伪存真1 小时前
前端如何让一套构建产物,可以部署多个环境?
前端
CC__xy1 小时前
04 类型别名type + 检测数据类型(typeof+instanceof) + 空安全+剩余和展开(运算符 ...)简单类型和复杂类型 + 模块化
开发语言·javascript·harmonyos·鸿蒙
KubeSphere1 小时前
EdgeWize v3.1.1 边缘 AI 网关功能深度解析:打造企业级边缘智能新体验
前端
小奋斗1 小时前
深入浅出:ES5/ES6+数组扁平化详解
javascript·面试
掘金安东尼2 小时前
解读 hidden=until-found 属性
前端·javascript·面试
yangholmes88882 小时前
如何为 Vue 组件提供 slots 静态类型检查
vue.js
1024小神2 小时前
jsPDF 不同屏幕尺寸 生成的pdf不一致,怎么解决
前端·javascript