【vue高频面试题】第 21 题:Vue3 中的 Slot(插槽)— 基础、原理、使用场景、面试必问点

Vue3 中的 Slot(插槽)完整解析

Slot 是一种组件内容分发机制,让父组件将内容注入到子组件内部的指定位置,使组件更灵活、更易复用。

一、什么是 Slot?

  • 解决"结构固定、内容不确定"的场景
  • 父组件可动态传入内容,提高复用性(如 DialogSelectCard

二、三类插槽

1. 默认插槽(Default Slot)

子组件:

vue 复制代码
<template>
  <div class="card">
    <slot></slot>
  </div>
</template>

父组件:

vue 复制代码
<Card>我是默认内容</Card>

2. 具名插槽(Named Slot)

子组件:

vue 复制代码
<slot name="header" />
<slot />
<slot name="footer" />

父组件:

vue 复制代码
<Card>
  <template #header>标题</template>
  默认内容
  <template #footer>底部</template>
</Card>

3. 作用域插槽(Scoped Slot)

将子组件的数据传给父组件,由父组件决定如何渲染:

子组件:

vue 复制代码
<slot :row="rowData"></slot>

父组件:

vue 复制代码
<Child v-slot="{ row }">
  <div>{{ row.name }}</div>
</Child>

表格组件(如 Element Plus、Ant Design Vue)的自定义列广泛使用作用域插槽。

三、运行原理(高频)

  • 父组件的插槽内容在"父作用域"编译,但在子组件的 slot 位置渲染
  • 子组件只提供渲染占位;作用域始终属于父组件

示例:

vue 复制代码
<Child>
  {{ count }}
</Child>

上例中 count 来自父组件作用域,子组件无法修改父模板变量。

四、Slot 与 Props 的关系

  • Props:父 → 子(传值)
  • Scoped Slot:子 → 父(传数据,父负责渲染)
  • 二者互补,slot 不能替代 props

五、核心使用场景

  • UI 组件扩展(DialogDrawer
vue 复制代码
<Dialog>
  <template #footer>
    <button>确定</button>
  </template>
</Dialog>
  • 表格自定义列(作用域插槽)
vue 复制代码
<el-table-column label="姓名">
  <template #default="{ row }">
    <b>{{ row.name }}</b>
  </template>
</el-table-column>
  • 动态模板注入(卡片、菜单、布局组件)

六、常见追问

  • 追问 1:为什么父组件变量能在子组件 slot 中显示?

    • 插槽内容在父作用域编译,渲染位置在子组件,但执行上下文仍属父组件
  • 追问 2:slotscoped slot 的本质区别?

    • slot:父 → 子,父提供内容
    • scoped slot:子 → 父,子提供数据,父决定渲染
  • 追问 3:Vue3 中 slot 的编译结果?

    • 默认插槽 → $slots.default?.()
    • 具名插槽 → $slots.header?.()
    • 作用域插槽 → 参数化渲染函数 (slotProps) => VNode
  • 追问 4:setup 中如何访问 slot?

js 复制代码
import { useSlots } from 'vue'
const slots = useSlots()
slots.default?.()
slots.header?.()
  • 追问 5:slot 是否可动态调用?
vue 复制代码
<component :is="slots[name]"></component>

在 Vue3 中,插槽本质上是函数。

七、一句话总结

编译在父、渲染在子、作用域属于父。Slot 是父模板注入;Scoped Slot 用于子 → 父的数据回传。

相关推荐
禅思院3 小时前
AI对话前端从入门到崩溃:一个长对话引发的五层优化战争【引子】
前端·面试·架构
TrisighT3 小时前
Electron 鸿蒙 PC 上点外链唤醒应用,我试了 6 种写法只有 1 种能跑
前端·electron·harmonyos
天才熊猫君4 小时前
配置与数据分离:一种可视化搭建的属性编辑方案
前端·javascript
林希_Rachel_傻希希4 小时前
web性能之相关路径——AI总结
前端·javascript·面试
掘金小豆4 小时前
Spring 事务失效的 6 大场景,你踩过几个?
后端·spring·面试
不好听6134 小时前
从零搭建一个 RAG 语义搜索系统 —— DEMO的初始阶段
javascript·面试·llm
竹林8184 小时前
用 wagmi v2 踩坑两天,我终于搞懂了多链钱包切换在 DeFi 前端中的正确姿势
前端·javascript
用户2136610035725 小时前
Vue项目搜索功能与面包屑导航
前端·javascript
星栈5 小时前
LiveView 的实时通信,爽是爽,但 PubSub 和广播也最容易把自己绕晕
前端·前端框架·elixir
用户2930750976695 小时前
告别关键词匹配,拥抱向量语义 —— RAG 搜索从零到一
前端