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

news2025/1/11 2:24:39

插槽是干啥的

插槽 就是 组件中的一个 占位符,
这个占位符 可以接收 父组件 传递过来的 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.coloradmin.cn/o/1321188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Amazon CodeWhisperer 体验

文章作者&#xff1a;jiangbei 1. CodeWhisperer 安装 1.1 先安装 IDEA&#xff0c;如下图&#xff0c;IDEA2022 安装为例&#xff1a; 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者…

MongoDB中的关系

本文主要介绍MongoDB中的关系。 目录 MongoDB的关系嵌入关系引用关系 MongoDB的关系 MongoDB是一个非关系型数据库&#xff0c;它使用了键值对的方式来存储数据。因此&#xff0c;MongoDB没有像传统关系型数据库中那样的表、行和列的概念。相反&#xff0c;MongoDB中的关系是通…

主馆位置即将售罄“2024北京国际信息通信展会”众多知名企聚京城

2024北京国际信息通信展&#xff0c;将于2024年9月份在北京国家会议中心盛大召开。作为全球信息通信技术领域的重要盛会&#xff0c;此次展会将汇集业内顶尖企业&#xff0c;展示最新的技术成果和产品。 目前&#xff0c;主馆位置即将售罄&#xff0c;华为、浪潮、中国移动、通…

数据结构(Chapter Two -02)—顺序表基本操作实现

在前一部分我们了解线性表和顺序表概念&#xff0c;如果有不清楚可以参考下面的博客&#xff1a; 数据结构(Chapter Two -01)—线性表及顺序表-CSDN博客 首先列出线性表的数据结构&#xff1a; #define MaxSize 50 //定义顺序表最大长度 typedef struct{ElemType data…

【面试】Java最新面试题资深开发-微服务篇(1)

问题九&#xff1a;微服务 什么是微服务架构&#xff1f;它与单体架构相比有哪些优势和劣势&#xff1f;解释一下服务发现和服务注册是什么&#xff0c;它们在微服务中的作用是什么&#xff1f;什么是API网关&#xff08;API Gateway&#xff09;&#xff1f;在微服务中它有何…

什么是关键词排名蚂蚁SEO

关键词排名是指通过搜索引擎优化&#xff08;SEO&#xff09;技术&#xff0c;将特定的关键词与网站相关联&#xff0c;从而提高网站在搜索引擎中的排名。关键词排名对于网站的流量和用户转化率具有至关重要的影响&#xff0c;因此它是SEO工作中最核心的部分之一。 如何联系蚂…

任务十六:主备备份型防火墙双机热备

目录 目的 器材 拓扑 步骤 一、基本配置 配置各路由器接口的IP地址【省略】 1、配置BGP协议实现Internet路由器之间互联 2、防火墙FW1和FW2接口IP配置与区域划分 3、配置区域间转发策略 4、配置NAPT和默认路由 5、配置VRRP组&#xff0c;并加入Active/standby VGMP管…

06-部署knative-eventing

环境要求 For prototyping purposes 单节点的Kubernetes集群&#xff0c;有2个可用的CPU核心&#xff0c;以及4g内存&#xff1b; For production purposes 单节点的Kubernetes集群&#xff0c;需要至少有6个CPU核心、6G内存和30G磁盘空间多节点的Kubernetes集群中&#xff0c;…

Redis设计与实现之慢查询日志

目录 一、慢查询日志 1、相关数据结构 2、慢查询日志的记录 3、慢查询日志的操作 4、如何设置慢查询的阈值&#xff1f; 5、如何查看慢查询日志的内容&#xff1f; 6、如何分析慢查询日志以找出性能瓶颈&#xff1f; 7、如何优化慢查询以提高Redis的性能&#xff1f; 8…

人工智能_机器学习069_SVM支持向量机_网格搜索_交叉验证参数优化_GridSearchCV_找到最优的参数---人工智能工作笔记0109

然后我们再来说一下SVC支持向量机的参数优化,可以看到 这次我们需要,test_data这个是测试数据,容纳后 train_data这个是训练数据 这里首先我们,导出 import numpy as np 导入数学计算包 from sklearn.svm import SVC 导入支持向量机包 分类器包 def read_data(path): wit…

纵横字谜的答案 Crossword Answers

纵横字谜的答案 Crossword Answers - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 翻译后大概是&#xff1a; 有一个 r 行 c 列 (1<r,c<10) 的网格&#xff0c;黑格为 * &#xff0c;每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格&…

【Vue2】Component template should contain exactly one root element.

问题描述 [plugin:vite:vue2] Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.原因分析 这个错误通常是由于 Vue 组件的模板中包含多个根元素导致的。Vue 要求组件模板中只…

【计算机网络】TCP协议——3. 可靠性策略效率策略

前言 TCP是一种可靠的协议&#xff0c;提供了多种策略来确保数据的可靠性传输。 可靠并不是保证每次发送的数据&#xff0c;对方都一定收到&#xff1b;而是尽最大可能让数据送达目的主机&#xff0c;即使丢包也可以知道丢包。 目录 一. 确认应答和捎带应答机制 二. 超时重…

Linear Regression线性回归(一元、多元)

目录 介绍&#xff1a; 一、一元线性回归 1.1数据处理 1.2建模 二、多元线性回归 2.1数据处理 2.2数据分为训练集和测试集 2.3建模 介绍&#xff1a; 线性回归是一种用于预测数值输出的统计分析方法。它通过建立自变量&#xff08;也称为特征变量&#xff09;和因变…

什么店生意好?C++采集美团商家信息做数据分析

最近遇到几个朋友&#xff0c;想要一起合伙投资一个实体店&#xff0c;不问类型&#xff0c;就看哪类产品相对比较受欢迎。抛除地址位置&#xff0c;租金的影响&#xff0c;我们之谈产品。因此&#xff0c;我熬了几个通宵&#xff0c;写了这么一段爬取美团商家商品信息的数据并…

Linux之grep、sed、awk

目录 1.grep 2.sed 3.awk 1.grep grep 擅长过滤查找&#xff0c;按行进行过滤 例&#xff1a; 当有用户对我们的主机进行爆破攻击时&#xff0c;我们可以使用grep将 ip 查找出来&#xff0c;进行封锁等处理 在 /var/log 目录下的 secure 文件中存放在用户登录连接信息&am…

JVM 垃圾回收详解

前言 什么是垃圾? 垃圾是指运行程序中没有任何引用指向的对象&#xff0c;需要被回收。 内存溢出和内存泄漏 内存溢出&#xff1a;经过垃圾回收之后&#xff0c;内存仍旧无法存储新创建的对象&#xff0c;内存不够溢出。 内存泄漏&#xff1a;又叫“存储泄漏”&#xff0…

Docker与微服务:构建和部署微服务架构的完整指南

微服务架构已经成为现代应用开发的主要范式之一&#xff0c;而Docker容器技术则为微服务的构建、部署和管理提供了理想的解决方案。本文将深入探讨如何使用Docker构建和部署微服务架构&#xff0c;提供更多示例代码和细致的指南&#xff0c;以帮助大家更全面地理解和运用这些关…

简单几步完成SVN的安装

介绍以及特点 SVN&#xff1a;Subversion&#xff0c;即版本控制系统。 1.代码版本管理工具 2.查看所有的修改记录 3.恢复到任何历史版本和已经删除的文件 4.使用简单上手快&#xff0c;企业安全必备 下载安装 SVN的安装分为两部分&#xff0c;第一部分是服务端安装&…

从零开始在Linux服务器配置并运行YOLO8+Web项目

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 神经网络&#xff08;随缘更新&#xff09; ✨特色…