Vue3-22-组件-插槽的使用详解

插槽是干啥的

插槽 就是 组件中的一个 占位符,
这个占位符 可以接收 父组件 传递过来的 html 的模板值,然后进行填充渲染。
就这么简单,插槽就是干这个的。要说它的优点吧,基本上就是可以使子组件的内容可以被父组件控制,显得更加灵活。

插槽的关键字

slot : 就是定义插槽的关键字。

插槽的几个小分类

插槽从使用的特点上,可以分为以下几个小类:
1、普通插槽 : 没有任何特殊性,最常规的那种;
2、默认值插槽 : 自带默认值的插槽,父组件没有传值时,会自动渲染默认值;
3、具名插槽 : 顾名思义,就是带名字的插槽,在组件中存在多个插槽时较为常用;
4、作用域插槽 : xxxxxx

插槽的使用案例

下面的案例,基本上包含了插槽常见的使用操作。

1、最简单的使用

【子组件】中声明 <slot></slot> 插槽;
【父组件】中使用组件的时候,直接传入相应的值。

子组件

<template><!-- 子组件 --><div class="childdiv">子组件 - msg : {{ msg }}<br><!-- 声明一个插槽 --><slot></slot></div></template><script setup lang="ts">import { ref } from 'vue'// 声明一个变量const msg = ref('这是子组件的msg变量')</script><style scoped>.childdiv{width: 300px;border: 1px solid green;}</style>

父组件

<template><div class="basediv">父组件msg : {{ msg }}<br><br><!-- 使用子组件 : 传入 内容,子组件的插槽中进行渲染 --><ChildComponent ><span style="color: green;">这是父组件给子组件插槽中传递的内容</span></ChildComponent></div></template><script setup lang="ts">import { ref } from 'vue'// 引入子组件import ChildComponent from './ChildComponent.vue'// 声明父组件的一个变量const msg = ref('这是父组件的msg变量')</script><style scoped>.basediv{width: 400px;height: 200px;border: 1px solid red;}
</style>

运行结果

在这里插入图片描述

2、带默认值的插槽

在<slot></slot> 标签中填写一些内容,就是它的默认值;
当父组件没有传值时,会渲染默认值;
当父组件传值时,会渲染父组件传递过来的值。

子组件

<template><!-- 子组件 --><div class="childdiv">子组件 - msg : {{ msg }}<br><!-- 声明一个插槽 : 是一个带有默认值的插槽--><slot><span style="color: rgb(126, 0, 128);">子组件中插槽的默认值</span></slot></div></template><script setup lang="ts">import { ref } from 'vue'// 声明一个变量const msg = ref('这是子组件的msg变量')</script><style scoped>.childdiv{width: 300px;border: 1px solid green;}</style>

父组件

<template><div class="basediv">父组件msg : {{ msg }}<br><br><!-- 使用子组件 : 不传值,子组件会渲染插槽的默认值 --><ChildComponent /><br><!-- 使用子组件 : 传入 内容,子组件的插槽中进行渲染 --><ChildComponent ><span style="color: green;">这是父组件给子组件插槽中传递的内容</span></ChildComponent></div></template><script setup lang="ts">import { ref } from 'vue'// 引入子组件import ChildComponent from './ChildComponent.vue'// 声明父组件的一个变量const msg = ref('这是父组件的msg变量')</script><style scoped>.basediv{width: 400px;height: 200px;border: 1px solid red;}
</style>

运行效果

在这里插入图片描述

3、具名插槽

组件中如果存在多个插槽,那么给插槽起个名字是一个不错的选择;
一方面在组件内容可以很好地对插槽进行区分;
另一方面,在父组件中使用插槽时,也可以指定名称使用插槽,比较明确。
具名插槽的定义格式  : <slot name="插槽名称"></slot>
具名插槽的使用方式1 : <template v-solt:插槽名称">xxx</template>
具名插槽的使用方式2 : <template #插槽名称">xxx</template>
【注意点】具名插槽 和 默认插槽可以同时存在;默认插槽 会被自动命名为 “default”;* 父组件在使用子组件的具名插槽时,建议 使用 <template> 标签将内容包起来。* 当子组件 同时接收到 具名插槽 和 默认插槽时,所有的位于 子组件 直接标签下的 节点,都会默认传给 默认插槽!* 父组件在使用子组件的插槽时,同一个插槽只能写一遍,否则会报错 (具名插槽和默认插槽都不可以重复使用)。

子组件 : 包含 【具名插槽】 和 【默认插槽】

<template><!-- 子组件 --><div class="childdiv">子组件 - msg : {{ msg }}<br><!-- 声明第一个具名插槽 --><slot name="slotname1"></slot><!-- 声明第二个具名插槽 --><slot name="slotname2"></slot><!-- 声明第一个默认插槽 --><slot ></slot><!-- 声明第二个默认插槽 --><slot ></slot></div></template><script setup lang="ts">import { ref } from 'vue'// 声明一个变量const msg = ref('这是子组件的msg变量')</script><style scoped>.childdiv{width: 350px;border: 1px solid green;}</style>

父组件 : 使用 子组件的【具名插槽】 和 【默认插槽】

<template><div class="basediv">父组件msg : {{ msg }}<br><br><!-- 使用子组件--><ChildComponent /><br><!-- 使用子组件 : 传入 内容,子组件的插槽中进行渲染 --><ChildComponent ><!-- 使用具名插槽1  : 写法1 : v-solt:插槽名--><template v-slot:slotname1>具名插槽 slotname1 : 父组件给子组件传的值 <br><br></template><!-- 使用具名插槽2  : 写法2 : #插槽名--><template #slotname2>具名插槽 slotname2 : 父组件给子组件传的值 <br><br></template><!-- 使用默认插槽1  : 写法1 : #default  : 推荐这种写法,比较明确--><template #default>匿名插槽 : 父组件给子组件传的值 <br><br></template><!-- 使用默认插槽2  : 写法2 : 在 子组件标签下的直接的节点,会直接渲染在默认插槽中--><!-- <span style="color: green;">这是父组件给子组件默认插槽中传递的内容<br></span> --></ChildComponent></div></template><script setup lang="ts">import { ref } from 'vue'// 引入子组件import ChildComponent from './ChildComponent.vue'// 声明父组件的一个变量const msg = ref('这是父组件的msg变量')</script><style scoped>.basediv{width: 400px;height: 200px;border: 1px solid red;}
</style>

运行效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4、作用域插槽

在上面的案例中,插槽中能够访问的只是【父组件】中的变量,而无法直接渲染【子组件】中的变量值;
尽管 带默认值的 插槽 可以将 【子组件】中的变量放进去,但 当【父组件】传值后,会将 默认值 覆盖,也无法保留【子组件】中的变量值;

作用域插槽就可以实现 将【子组件】想要暴露出去的变量值传递给 【父组件】,【父组件】再将变量的值放到 插槽中,进而实现 渲染 【子组件】的变量的功能。

由于 默认插槽具名插槽 的编码方式不同,因此本小结将分开描述具体的写法。

4.1 只有默认插槽的使用案例

子组件 : 通过 props 将属性暴露出去
父组件 :在 【子组件】的标签上,直接使用 v-slot 指令 接收暴露出来的属性

子组件

<template><!-- 子组件 --><div class="childdiv">子组件 - msg : {{ msg }}<br><!-- 声明一个默认插槽 : 并通过属性暴露出去两个属性 --><slot :aName="a" :bName="b"></slot></div></template><script setup lang="ts">import { ref } from 'vue'// 声明一个变量const msg = ref('这是子组件的msg变量')// 声明两个属性-暴露出去const a = ref('这是第一个属性')const b = ref(100)</script><style scoped>.childdiv{width: 350px;border: 1px solid green;}</style>

父组件

<template><div class="basediv">父组件msg : {{ msg }}<br><br><!-- 使用子组件 : 传入 内容,子组件的插槽中进行渲染 --><ChildComponent v-slot="childProps">【父组件中接收到了子组件暴露出来的属性】:<br>{{ childProps }}</ChildComponent></div></template><script setup lang="ts">import { ref } from 'vue'// 引入子组件import ChildComponent from './ChildComponent.vue'// 声明父组件的一个变量const msg = ref('这是父组件的msg变量')</script><style scoped>.basediv{width: 400px;height: 200px;border: 1px solid red;}
</style>

运行结果

在这里插入图片描述

4.2 只有具名插槽的使用案例

父组件在使用子组件的具名插槽时,
需要在 slot 的名称后面接收子组件暴露出来的属性。
语法格式1 :v-slot:name="propsName"
语法格式2 :#name="propsName"

子组件

<template><!-- 子组件 --><div class="childdiv">子组件 - msg : {{ msg }}<br><!-- 声明一个具名插槽 --><slot name="slotname1" :aName1="a" :aName2="b"> </slot><!-- 声明一个具名插槽 --><slot name="slotname2" :bName1="a" :bName2="b"></slot></div></template><script setup lang="ts">import { ref } from 'vue'// 声明一个变量const msg = ref('这是子组件的msg变量')// 声明两个属性-暴露出去const a = ref('这是第一个属性')const b = ref(100)</script><style scoped>.childdiv{width: 350px;border: 1px solid green;}</style>

父组件

<template><div class="basediv">父组件msg : {{ msg }}<br><br><!-- 使用子组件 : 传入 内容,子组件的插槽中进行渲染 --><ChildComponent ><!-- 使用具名插槽1  : 写法1 : v-solt:插槽名--><template v-slot:slotname1="propsObj1">父组件静态文本1 : 第一种写法<br>{{ propsObj1 }}</template><!-- 使用具名插槽2  : 写法2 : #插槽名--><template #slotname2="propsObj2">父组件静态文本2 : 第二种写法<br>{{ propsObj2 }}</template></ChildComponent></div></template><script setup lang="ts">import { ref } from 'vue'// 引入子组件import ChildComponent from './ChildComponent.vue'// 声明父组件的一个变量const msg = ref('这是父组件的msg变量')</script><style scoped>.basediv{width: 400px;height: 200px;border: 1px solid red;}
</style>

运行结果

在这里插入图片描述

4.3 默认插槽和具名插槽的混合使用案例

当 子组件中同时具有 具名插槽和 默认插槽 还需要给 父组件 暴露属性时,
默认插槽 的方式要 与 具名插槽的方式一致,即 使用默认的名称 default
也就是需要使用 <template> 标签将内容包起来

子组件

<template><!-- 子组件 --><div class="childdiv">子组件 - msg : {{ msg }}<br><!-- 声明一个具名插槽 --><slot name="slotname2" :bName1="a" :bName2="b"></slot><!-- 声明一个默认插槽 : 并通过属性暴露出去两个属性 --><slot :cName1="a" :cName2="b"></slot></div></template><script setup lang="ts">import { ref } from 'vue'// 声明一个变量const msg = ref('这是子组件的msg变量')// 声明两个属性-暴露出去const a = ref('这是第一个属性')const b = ref(100)</script><style scoped>.childdiv{width: 350px;border: 1px solid green;}</style>

父组件

<template><div class="basediv">父组件msg : {{ msg }}<br><br><!-- 使用子组件 : 传入 内容,子组件的插槽中进行渲染 --><ChildComponent ><!-- 使用具名插槽2  : 写法2 : #插槽名--><template #slotname2="propsObj2">具名插槽: 使用#语法糖的格式指定具名插槽<br>{{ propsObj2 }}</template><!-- 使用默认插槽1  : 写法1 : #default--><template #default="propsObj3">匿名插槽  : 要与具名插槽的写法保持一致 <br>{{ propsObj3 }}</template></ChildComponent></div></template><script setup lang="ts">import { ref } from 'vue'// 引入子组件import ChildComponent from './ChildComponent.vue'// 声明父组件的一个变量const msg = ref('这是父组件的msg变量')</script><style scoped>.basediv{width: 400px;height: 200px;border: 1px solid red;}
</style>

运行结果

在这里插入图片描述

以上就是 组件中 插槽的主要内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/284912.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【️接口和抽象类的区别,如何选择?】

✅接口和抽象类的区别&#xff0c;如何选择&#xff1f; ✅ 接口和抽象类的区别✅方法定义✅修饰符✅构造器✅继承和实现✅单继承 、 多实现✅职责不同 ✅什么是模板方法模式&#xff0c;有哪些应用呢&#xff1f;✅典型理解✅示例&#x1f4a1;思考 ✅你在工作中是如何使用设计…

PythonStudio:国人开发的python窗体IDE,学生管理系统

国人开发的python窗体设计IDE&#xff0c;详情请看&#xff1a;PythonStudio&#xff1a;一款国人写的python及窗口开发编辑IDE&#xff0c;可以替代pyqt designer等设计器了-CSDN博客 这个软件作者还录制了入门的教程&#xff0c;跟着视频做&#xff0c;是个不错的python视频…

mysql使用全文索引+ngram全文解析器进行全文检索

表结构&#xff1a;表名 gamedb 主键 id 问题类型 type 问题 issue 答案 answer 需求 现在有个游戏资料库储存在mysql中&#xff0c;客户端进行搜索&#xff0c;需要对三个字段进行匹配&#xff0c;得到三个字段的相关性&#xff0c;选出三个字段中相关性最大的值进…

Python---进程

1. 进程的介绍 在Python程序中&#xff0c;想要实现多任务可以使用进程来完成&#xff0c;进程是实现多任务的一种方式。 2. 进程的概念 一个正在运行的程序或者软件就是一个进程&#xff0c;它是操作系统进行资源分配的基本单位&#xff0c;也就是说每启动一个进程&#xf…

第三十五周:文献阅读+Self-attention

目录 摘要 Abstract 文献阅读&#xff1a;基于LSTM和注意机制的水质预测 现有问题 提出方法 前提点 1. LSTM 2. 注意力机制 研究模型&#xff08;AT-LSTM&#xff09;结构 模型验证 总结AT-LSTM优于LSTM的方面 Self-attention&#xff08;自注意力机制&#xff09;…

机器学习——支持向量机

目录 一、基于最大间隔分隔数据 二、寻找最大间隔 1. 最大间隔 2. 拉格朗日乘子法 3. 对偶问题 三、SMO高效优化算法 四、软间隔 五、SMO算法实现 1. 简化版SMO算法 2. 完整版SMO算法 3. 可视化决策结果 六、核函数 1. 线性不可分——高维可分 2. 核函数 …

100GPTS计划-AI翻译TransLingoPro

地址 https://poe.com/TransLingoPro https://chat.openai.com/g/g-CfT8Otig6-translingo-pro 测试 输入: 我想吃中国菜。 预期翻译: I want to eat Chinese food. 输入: 请告诉我最近的医院在哪里。 预期翻译: Please tell me where the nearest hospital is. 输入: 明天…

React实现全局Loading

css #__loading {position:fixed;top: 0;left: 0;z-index: 99999;display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;background: rgba(0, 0, 0, 0); } 页面代码 使用了antd的Spin组件 import React from react import ReactDOM from re…

举办知识竞赛活动的目的和意义

上世纪80年代以来&#xff0c;知识竞赛日益普及&#xff0c;已成为广大青年所喜爱的一项活动。“知识竞赛热”的出现不是偶然的&#xff0c;它是读书活动深入发展的结果&#xff0c;是广大青年求知成才的一个缩影。因此&#xff0c;如何组织好知识竞赛&#xff0c;是一个需要认…

LLaMA系列模型

1.LLama 1.1 简介 Open and Efficient Foundation Language Models (Open但没完全Open的LLaMA) 2023年2月&#xff0c;Meta&#xff08;原Facebook&#xff09;推出了LLaMA大模型&#xff0c;使用了1.4T token进行训练&#xff0c;虽然最大模型只有65B&#xff0c;但在相关评…

vs code调试.so文件

使用vs code调试.so文件 1 vs code中安装c的debug插件2 【重要】编写launch.json3 在.so的源码中打断点4 debug模式启动进程5 attach进程6 开始调试 .so是一种动态链接库&#xff0c;在大型项目以及跨语言项目中经常用到。在拿到.so文件对应的源码后进行debug呢&#xff1f; 简…

区域和检索算法(leetcode第303题)

题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;处理以下类型的多个查询:计算索引 left 和 right &#xff08;包含 left 和 right&#xff09;之间的 nums 元素的 和 &#xff0c;其中 left < right 实现 NumArray 类&#xff1a;NumArray(int[] nums) 使用数组…