默认插槽

插槽可以让父组件给子组件传递模板片段

  1. 在父组件中,在组件内编写模板片段传递给子组件
  2. 在子组件中,编写 slot 元素,指定模板片段输出的位置
  • 插槽内容可以访问到父组件的数据,但无法访问到子组件的数据。因为插槽本身是在父组件模板中定义的
  • 可以在子组件的 slot 标签内设置插槽的默认内容。当父组件没有提供任何插槽内容时,子组件会渲染默认内容
<template><!-- 在组件内编写模板片段传递给子组件 --><HelloWorld> {{ content }} </HelloWorld>
</template><script lang="ts" setup>
import HelloWorld from '@/components/HelloWorld.vue';
import { ref } from 'vue';const content = ref('插槽内容');
</script>
<template><p><!-- 编写 `slot` 元素,指定模板片段输出的位置 --><slot> 插槽默认内容 </slot></p>
</template>

具名插槽

当一个组件中包含多个插槽出口时,需使用具名插槽指定父组件中的内容要传到哪个 slot 元素内

  1. 在子组件中,给 slot 元素设置 name attribute,来唯一标识各个插槽

    没有提供 nameslot 会隐式地命名为 'default'

  2. 在父组件中,给 template 元素设置 v-slot 指令,并将目标插槽的名字传给该指令

    v-slot 指令可以简写为 #

    • 默认插槽写法:v-slot / v-slot:default / #default
    • 具名插槽写法:v-slot:XXName / #XXName
<template><p><slot name="header"> header 插槽默认内容 </slot><slot> 插槽默认内容 </slot><slot name="footer"> footer 插槽默认内容 </slot></p>
</template>
<template><HelloWorld><template #header> header </template><template #default> default </template><template #footer> footer </template></HelloWorld>
</template><script lang="ts" setup>
import HelloWorld from '@/components/HelloWorld.vue';
</script>
  • 当一个组件同时接收默认插槽和具名插槽时,所有位于顶级的非 template 节点都被隐式地视为默认插槽内容。
    所以上例可以写成:
<template><HelloWorld><template #header> header </template><!-- 隐式的默认插槽 -->default<template #footer> footer </template></HelloWorld>
</template>

作用域插槽

在某些场景下,插槽的内容需要使用到子组件中的数据。此时可以使用作用域插槽

  1. 在子组件中,给 slot 元素设置自定义属性,以传递数据给父组件
  2. 在父组件中,从 v-slot 指令的值中获取子组件传递过来的数据
    • 默认插槽写法:v-slot="XXX" / v-slot:default="XXX" / #default="XXX"
    • 具名插槽写法:v-slot:XXName="XXX" / #XXName="XXX"
  • 注意插槽上的 name 是一个 Vue 特别保留的 attribute,不会作为 props 传递给插槽
<template><p><slotname="header"text="header slot">header 插槽默认内容</slot><!-- 使用 v-bind 设置自定义属性 --><slot v-bind="data"> 插槽默认内容 </slot></p>
</template><script setup lang="ts">
import { ref } from 'vue';const data = ref({ text: 'default slot', number: 1 });
</script>
<template><HelloWorld><template #header="headerData"> header: {{ headerData }} </template><!-- 使用 [解构赋值] 获取子组件传递过来的数据 --><template #default="{ text, number }"> default: {{ text }} - {{ number }}</template></HelloWorld>
</template><script lang="ts" setup>
import HelloWorld from '@/components/HelloWorld.vue';
</script>

动态插槽名

可以给 v-slot 指令传递动态参数,就可以定义动态插槽名啦

  • 动态参数中表达式的值只能为 String / nullnull 表示移除该绑定
  • 动态参数表达式有一些语法限制,比如空格和引号,在 HTML attribute 名称中都是不合法的;
    推荐使用 [计算属性] 替换复杂的表达式
<base-layout><template v-slot:[dynamicSlotName]>...</template><!-- 缩写为 --><template #[dynamicSlotName]>...</template>
</base-layout>

【Vue3】如何使用插槽相关推荐

  1. Vue3中slot插槽使用方式

    一文搞懂Vue3中slot插槽的使用! 使用 Vue 的小伙伴相信你一定使用过插槽,如果你没有用过,那说明你的项目可能不是特别复杂.插槽(slot)可以说在一个 Vue 项目里面处处都有它的身影,比如 ...

  2. vite+vue3使用slot插槽

    如何简单明了使用slot插槽 在官网已经表明如何使用,但我觉得看的有点小乱,本文章记录一下,也是整理自己的思路 使用solt的理由:在不同的组件使用,它最核心的地方展示是不一样的,但其它的地方是一样的 ...

  3. Vue3.0的插槽是如何实现的?

    Vue提供了pro可以进行参数的传递,但是有时需要给子组件的模板进行定制化,此时传递参数有时候就不太方便了. Vue借鉴了Web Components实现了插槽slot. 插槽slot通过在父组件中编 ...

  4. 前端之vue2 vue3插槽

    vue插槽 一.默认插槽 二.具名插槽 (多个插槽) vue3已弃用该方法 vue3支持\ vue3的作用域插槽 总结 一.默认插槽 1.在组件中留下插槽slot <template>&l ...

  5. vue3中的setup函数

    一.概念: setup是vue3中的一个新的配置项,值为一个函数,我们在组件中用到的数据.方法等等,都要配置在setup中. 二.详解: setup函数的返回值有两种 1.返回一个渲染函数,可以自定义 ...

  6. 【分享】免梯子的GPT,玩 ChatGPT 的正确姿势

    火了一周的 ChatGPT,HG 不允许还有小伙伴不知道这个东西是什么?简单来说就是,你可以让它扮演任何事物,据说已经有人用它开始了颜色文学创作.因为它太火了,所以,本周特推在几十个带有"c ...

  7. javascript_javascript吊装

    javascript Hoisting is a JavaScript mechanism where variables and function declarations are moved to ...

  8. vue表格显示图片,采用element ui实现

    项目场景: vue表格显示图片,采用element ui实现 <template><el-table :data="tableData" style=" ...

  9. Non-function value encountered for slot “role“. Prefer function slots for better performance.

    shi控制台出现警告:Non-function value encountered for slot "role". Prefer function slots for bette ...

  10. 使用vue实现九宫格抽奖功能

    使用vue2和vue3分别实现九宫格抽奖功能 关于九宫格抽奖的功能,想必大家都见过.外圈为奖品,中间是一个抽奖的按钮,接下来就讲解怎么实现九宫格的抽奖功能. 本demo使用技术:vue2/vue3,作 ...

最新文章

  1. javascript+dom
  2. Oracle如何监控表的DML次数
  3. Unable to lock JVM Memory: error=12--elasticsearch
  4. 检测窥屏_开挂、狙击、窥屏?乱象丛生的炉石狂野天梯,到底怎么了?
  5. 慕学在线网0.4_xadmin后台管理
  6. linux7 chkconfig,centos 6-7 chkconfig -systemctl关系对比
  7. c#日期转换周几_RPA经验:使用 selector 选择日期
  8. sybase修改密码
  9. 8月9日 华为发布了其自研的鸿蒙操作系统,华为正式发布自研操作系统鸿蒙,面向AI全场景...
  10. Air与java通信
  11. 3Y叔的clusterProfiler-book阅读Chapter 3 Universal enrichment analysis
  12. 《转》牛顿法与拟牛顿法学习笔记
  13. 百度世界2021:百度大脑升级、昆仑芯2量产、智能云加速AI落地爆发
  14. 盘点云计算的概念,分类和特点
  15. lbp2900打印机linux驱动下载,lbp2900打印机驱动下载
  16. STC - 非标连接的7段数码管赋值
  17. 9 个 yyds 的 Java 项目,可应对各种私活
  18. vue实现页面锁屏完美解决
  19. python中正则表达式与jieba分词的使用
  20. 数据库原理:了解范式(1NF、2NF、3NF、BCNF),做例题快速弄懂

热门文章

  1. VB.NET使用S7.NET.dll连接西门子PLC200、200smart、300、400、1200
  2. windows系统中创建以 点 .开头的文件及文件夹的方法
  3. (附源码)springboot+mysql+基于java的邮件收发管理系统 毕业设计101025
  4. 网络密码:越复杂越好?
  5. WordPress怎么使用支持注册用户上传自定义头像功能?
  6. 虚拟现实初探——【第一天】概述-1
  7. 矩阵论(七):投影矩阵
  8. 解决无线网卡工作一段时间USB就自动断开连接(by liukun321咕唧咕唧)
  9. 最接近人类编程语言的REBOL
  10. HPE脚本更新致京都大学77TB数据被删