Vue3中的slot插槽知识总结,看这一篇就够了!
2025年4月 · 预计阅读时间: 5 分钟
Vue 中的 slot 是一种用于组件内容分发的技术。它允许父组件向子组件传递任意内容,根据插槽的位置显示在任意位置,从而使组件更加灵活和可组合。
作用: 增加了组件的复用性,同时也可以让代码结构更清晰,利于团队协作和组件库的开发。
1 默认插槽#
最基本的插槽类型。当使用子组件时,没有指定具体名字的插槽的内容就会被渲染到默认插槽位置。
例子:
2 具名插槽#
为不同的插槽区域使用 name 属性命名,父组件在传递内容时可以使用<template #插槽的名字>... </template>或<template v-slot:插槽的名字>...</template>来指定父组件传递的内容显示在子组件的位置。
例子:
3 条件插槽#
根据判断条件渲染不同插槽,比如v-if...v-else。
例子:
4 动态插槽#
可以理解为具名插槽的升级吧,只是这个插槽的名字是一个变量,会变。通过这个插槽名字的变化,他就能在子组件的固定位置动态显示父组件传过来的不同插槽内容。
例子:
假设你有一个 DynamicTab 组件,根据选中的标签动态展示内容
在父组件中使用时,通过 v-slot 将每个标签对应的内容关联到正确的名称上:
5 作用域插槽#
作用域插槽(scoped slot)允许子组件向插槽内容传递数据或方法,从而让父组件在使用插槽时能获得子组件的局部状态或计算结果。 也就是说父组件里面使用子组件的插槽时,可以通过插槽获取到子组件传过来的值。
5.1. 常规用法#
例子:
假设我们有一个 ListDisplay 组件,用于展示一组列表数据,并将每个列表项的数据通过作用域插槽传递给父组件以便自定义渲染
在父组件中,我们通过作用域插槽接收子组件传来的 item 数据,并灵活地自定义列表项的展示形式:
5.2. 进阶用法:传递多个数据#
作用域插槽不仅可以传递单个数据,也可以传递多个数据或方法。例如,一个图表组件可能需要传递数值和格式化方法:
6. 举一反三:插槽混合使用#
下面这个是一个基于 Vue 3+ 组合式 API 语法编写的综合示例,包含默认插槽、具名插槽、条件插槽和作用域插槽。示例中定义了一个 UserCard 组件,以及一个父组件 ParentComponent,父组件在使用 UserCard 时灵活定制各个插槽的内容。
子组件 UserCard.vue:
这个组件是使用 vue3+组合式 API(通过 <script setup> 语法)来定义 props 和内部方法,把多种插槽结合在一起灵活使用,同时包含:
- 具名插槽
**header**:可自定义头部信息,默认显示用户姓名; - 默认插槽:显示主体内容,默认展示用户年龄;
- 条件插槽
**premium**:当user.isPremium为true时才展示高级会员区域(可被父组件覆盖); - 作用域插槽
**actions**:将用户数据传递到父组件,父组件可自定义操作按钮。、
父组件 ParentComponent.vue:
父组件使用组合式 API,通过 <script setup> 导入并使用 UserCard 组件,同时对各个插槽进行定制:
- 为具名插槽
header提供自定义头部显示; - 默认插槽中覆盖了组件内部提供的主体内容;
- 条件插槽
premium被父组件自定义显示高级会员信息; - 作用域插槽
actions接收了传递的user数据,自定义一个操作按钮。
7 小结#
ok,vue 的所有插槽在上面已经总结完毕,可能在我们开发中默认插槽、具名插槽、条件插槽会用的多一些,复杂的组件封装时作用域插槽也会有所使用,动态插槽用的少些,可能是我使用的少。知识点就是上面这些,更多的是在我们日常开发中要灵活使用、融会贯通。