第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. 高阶组件:通过作用域插槽传递业务数据


最佳实践

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

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

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

相关推荐
文心快码BaiduComate6 小时前
限时集福!Comate挂件/皮肤上线,符(福)气掉落中~
前端·后端·程序员
勇敢di牛牛6 小时前
vue3 + mars3D 三分钟画一个地球
前端·vue.js
IT_陈寒7 小时前
Python+AI实战:用LangChain构建智能问答系统的5个核心技巧
前端·人工智能·后端
袁煦丞8 小时前
MoneyPrinterTurbo一键生成短视频:cpolar内网穿透实验室第644个成功挑战
前端·程序员·远程工作
代码小学僧8 小时前
让 AI 真正帮你开发:前端 MCP 实用技巧分享
前端
晴殇i8 小时前
前端鉴权新时代:告别 localStorage,拥抱更安全的 JWT 存储方案
前端·javascript·面试
Json____8 小时前
使用node Express 框架框架开发一个前后端分离的二手交易平台项目。
java·前端·express
since �8 小时前
前端转Java,从0到1学习教程
java·前端·学习
码农刚子8 小时前
ASP.NET Core Blazor简介和快速入门 二(组件基础)
javascript·后端
小奋斗8 小时前
面试官:[1] == '1'和[1] == 1结果是什么?
前端·面试