400-9969-069 (24h)

028-86052918

首页 > 天健资讯>文章详情

Vue插槽:组件里的"万能格子",一文讲透

2026.11.06

25

字号: AA A

一、组件就像快递柜

封装弹窗组件时,样式、遮罩、关闭逻辑都写好了,但内容千变万化——有时是文本,有时是表单,有时是图表。用 Props 传整个 HTML?代码臃肿还丢封装性。

插槽(Slot)就是解决方案:子组件控制结构,父组件决定内容——就像快递柜,子组件搭柜子,父组件塞包裹。

二、编译作用域

核心规则:插槽内容在哪里定义,就只能访问哪里的数据。 父组件插槽里只能访问父组件数据,需要子组件数据时要用"作用域插槽"(后面讲)。

三、默认插槽

没被 template v-slot 包裹的内容自动进入默认插槽。

子组件:

<button><slot></slot></button>

父组件使用:

<Button>提交订单</Button>

后备内容: <slot>提交</slot> —— 不传内容时显示"提交",传了则覆盖。

四、具名插槽

布局组件有多个位置(头部、主体、侧边栏),用名称精准投递:

子组件:

<header><slot name="header"></slot></header>
<main><slot name="main"></slot></main>
<aside><slot name="sidebar"></slot></aside>

父组件使用:

<BaseLayout>
<template #header><h1>网站标题</h1></template>
<template #main>主体内容</template>
</BaseLayout>

注意:没被 template v-slot 包裹的"游离内容"会进入默认插槽。

五、作用域插槽

子组件主动把数据"递"给父组件——在 slot 上绑定属性,父组件接收 SlotProps。

本质: 作用域插槽就是一个函数。子组件渲染时调用它,把内部数据当参数传进去。

实战:封装列表组件,每项样式由父组件决定。

子组件(FancyList.vue):

<li v-for="(item, index) in items" :key="item.id">
<slot :item="item" :index="index">
<span>{{ item.name }}</span>
</slot>
</li>

父组件使用:

<FancyList :items="users">
<template #default="{ item, index }">
<div>
<span>{{ index + 1 }}</span>
<img :src="item.avatar" />
<strong>{{ item.name }}</strong>
</div>
</template>
</FancyList>

FancyList 只负责循环和结构,"卡片长什么样"完全交给父组件——这就是控制反转。

无渲染组件: 不渲染 DOM,只处理逻辑(拖拽、分页),通过作用域插槽暴露数据。逻辑与 UI 完美分离。

六、Vue3 改进

• 函数式插槽: 普通和作用域插槽统一编译为函数,支持延迟渲染。

• 静态内容提升: 纯静态内容提升到渲染函数外,不参与 Diff。

• Block 树靶向更新: 通过 patchFlag 直接更新变化块,减少 Diff 开销。

• TypeScript 友好: defineSlots(Vue 3.3+)提供完整类型推导。

七、高级技巧

• 条件插槽: 用 $slots 检测是否传入插槽,决定是否渲染包裹元素。

• 动态插槽名: template #[dynamicSlotName],插槽名可以是变量。

• 插槽降级: 结合 Fallback 实现优雅兜底——没有 custom 就用 default,再没有显示"暂无内容"。

八、常见坑

• 作用域陷阱: 插槽里直接用子组件变量会报错,必须通过 slot :data="data" 显式传递。

• 性能: 默认插槽放大量静态 HTML 且有父组件频繁更新时仍有开销,纯静态内容尽量在子组件内硬编码。

• 缩写规范: 独占默认插槽可写 Comp v-slot="item";有具名插槽时默认插槽必须用 template #default 包裹。

• 避免过度设计: 仅文本/图标变化用 Props 就够了,插槽适用于结构不确定或需要控制反转的场景。



业务咨询:400-9969-069 (24小时服务)
028-86052918

售后热线:028-86052836

在线反馈

关注我们

微信公众号

抖音号

在线反馈

公司地址:成都市武侯区天益街38号理想中心3栋1810

Copyright© 天健世纪科技 All Rights Reserved.

蜀ICP备16016808号

长按/截图保存,微信识别二维码 或关注公众号“天健世纪科技”

扫一扫,关注我们

公司地址:成都市武侯区天益街38号理想中心3栋1810

Copyright© 天健世纪科技 All Rights Reserved. 蜀ICP备16016808号

产品 解决方案 合作客户 服务保障 天健资讯 关于我们