Vue之插槽(slot)

插槽是vue中的一个非常强大且灵活的功能,在写组件时,可以为组件的使用者预留一些可以自定义内容的占位符。通过插槽,可以极大提高组件的客服用和灵活性。

插槽大体可以分为三类:默认插槽,具名插槽和作用域插槽。

下面将一一介绍。

①默认插槽

这种插槽没有指定名称,用于接受父组件传递的未明确指定插槽名称的内容。在子组件中使用<slot></slot>定义插槽所在位置,父组件在书写子组件的标签体里书写插入到该插槽的内容。

代码如下:

父组件:index.vue

<!--* @Author: RealRoad* @Date: 2024-10-18 10:49:28* @LastEditors: Do not edit* @LastEditTime: 2024-11-14 14:13:02* @Description: * @FilePath: \project_10_08\vite-project\src\views\home\index.vue
--><template><div class="box"><Category class="content"><div>我是文本</div><img src="https://img0.baidu.com/it/u=454995986,3330485591&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=375" alt=""></Category><Category class="content"><el-button type="primary" size="default" @click="">一个按钮</el-button></Category><Category class="content"><el-card shadow="always" :body-style="{ padding: '20px' }"><div slot="header"><span>卡片标题</span></div><!-- card body --><div>卡片体</div></el-card></Category></div>
</template><script setup lang="ts">
import {ref,reactive} from 'vue'
import Category from './Category.vue'
</script><style scoped lang="scss">
.box{display:flex;justify-content: space-evenly;margin-top: 20px;.content{margin-left: 10px;background:pink;text-align: center;width: 400px;height: 600px;img{width: 100%;}}
}
</style>

子组件:Category.vue

<template><div>我是子组件<!-- 一个默认插槽 --><slot>插槽的默认内容</slot></div>
</template><script setup lang="ts">
import {ref,reactive} from 'vue'</script><style scoped></style>

来看效果:

当然了,在子组件中,可以书写插槽的默认内容,就是说如果父组件没有书写任何内容,就会默认使用子组件插槽内的内容。

 再写一个子组件,看一下效果

②具名插槽

顾名思义,就是带有名称的插槽,用于接受父组件中明确指定插槽名称的内容。

这里需要注意,vue2和vue3的写法略有不同,因为v3兼容v2,所有有些老版本的项目写的插槽还是v2的写法。

首先看v3的具名插槽写法:

子组件的写法相同,在子组件中使用<slot name="插槽名"></slot>就可以给插槽起一个名字。

子组件(NamedSlot.vue):

<template><div>我是子组件2<!-- 一个默认插槽 --><slot name="top">插槽的默认内容</slot><slot name="bottom">插槽的默认内容</slot></div>
</template><script setup lang="ts">
import {ref,reactive} from 'vue'</script><style scoped></style>

来到父组件(index.vue):v3

<!--* @Author: RealRoad* @Date: 2024-10-18 10:49:28* @LastEditors: Do not edit* @LastEditTime: 2024-11-14 14:40:49* @FilePath: \project_10_08\vite-project\src\views\home\index.vue* @Description: 
--><template><div class="box"><NamedSlot class="content"><template #top><div >我是文本</div></template><template #bottom><img src="https://img0.baidu.com/it/u=454995986,3330485591&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=375" alt=""></template></NamedSlot><Category class="content"><el-button type="primary" size="default" @click="">一个按钮</el-button></Category><Category class="content"><el-card shadow="always" :body-style="{ padding: '20px' }"><div slot="header"><span>卡片标题</span></div><!-- card body --><div>卡片体</div></el-card></Category><Category class="content"></Category></div>
</template><script setup lang="ts">
import {ref,reactive} from 'vue'
import Category from './Category.vue'
import NamedSlot from './NamedSlot.vue';
</script><style scoped lang="scss">
.box{display:flex;justify-content: space-evenly;margin-top: 20px;.content{margin-left: 10px;background:pink;text-align: center;width: 400px;height: 600px;img{width: 100%;}}
}
</style>

可以对比一下上面的默认插槽,我们只修改了第一个子组件,其他的还是保持不变。

先看一下效果:

效果是一样的,不过是我们在子组件中起了名字,这样我们就可以在父组件随便改变顺序,就不用改变代码顺序了,直接修改插槽的名字即可。

说一下v3中的父组件的具名插槽的写法:

<子组件名称 >

    <template #插槽名>

        插槽内容

    </template>

</子组件名称> 

这样的格式,借用了template标签,并在标签上使用#的简写形式,也是现在element-plus等新版UI组件库使用的方式。

说完了v3,那一定要说一下老版本的v2写法,毕竟老项目中的都是这样的写法:

<子组件名称>

<子组件内容--标签 slot="插槽名"> </子组件内容--标签 >

</子组件名称>

注意:这里面在测试的时候出现了一个误区,我直接卸载了子组件名称的属性上,导致里面的内容也是无法正常显示。

这就比较难受,在vue3项目中使用vue2的老具名插槽用法不显示,原因可能有很多,保险起见,还是专门用脚手架建立的vue2项目中进行测试。

 所以紧急来到上次做的vue2项目中,进行老语法测试:

父组件:index.vue

<!--* @Author: RealRoad* @Date: 2024-11-12 09:25:23* @LastEditors: Do not edit* @LastEditTime: 2024-11-14 15:29:28* @Description: * @FilePath: \datalized-crm-ui\datalized-crm-ui\src\views\test\index.vue
-->
<!--* @Author: RealRoad* @Date: 2024-11-12 09:25:23* @LastEditors: Do not edit* @LastEditTime: 2024-11-12 16:10:43* @Description: * @FilePath: \datalized-crm-ui\datalized-crm-ui\src\views\test\index.vue
-->
<template><div><ComponentA ><div slot="top">测试一波具名插槽<img src="https://img1.baidu.com/it/u=1047145501,4073770646&fm=253&app=120&size=w931&n=0&f=JPEG&fmt=auto?sec=1731690000&t=14c402c69d53274bb7fa9af0d0e0e392" alt=""></div></ComponentA><ComponentB /><!-- <a-form layout="inline" class="my-customer-form" @keyup.enter.native="searchQuery"><a-form-item label="商机名称"><a-inputplaceholder="请输入商机名称"></a-input></a-form-item><a-form-item label="客户名称"><a-inputplaceholder="请输入客户名称"allowClear></a-input></a-form-item><a-form-item label="赢单率"><a-select:getPopupContainer="node => node.parentNode"placeholder="请选择赢单率"default-value="10%"style="width: 100%":style="{ width: searchItemWidth }"><a-select-option value="10%"> 10%</a-select-option><a-select-option value="20%"> 20%</a-select-option><a-select-option value="30%"> 30%</a-select-option><a-select-option value="40%"> 40%</a-select-option><a-select-option value="50%"> 50%</a-select-option><a-select-option value="60%"> 60%</a-select-option><a-select-option value="70%"> 70%</a-select-option><a-select-option value="80%"> 80%</a-select-option><a-select-option value="90%"> 90%</a-select-option><a-select-option value="100%"> 100%</a-select-option></a-select></a-form-item><a-form-item label="商机状态"><j-dict-select-tagtype="radioButton"dictCode="chance_status"/></a-form-item></a-form><hr>展示一下过度<div><a-button type="primary" @click="isShow=!isShow">显示/隐藏</a-button><transition name="mez" appear @afterEnter="handleEnter"@after-leave="handleLeave"@appear="handleAppear"@after-appear="myhandleEnter"@before-enter="myEnter"@enter="handleEnter"@leave="handleLeave"><h1 v-show="isShow" >测试文本</h1></transition></div>1112 --></div>
</template><script>import ComponentA from './brotherA.vue'
import ComponentB from './brotherB.vue'
import JDictSelectTag from '@/components/dict/JDictSelectTag'
export default {name: 'Test',data() {return {searchItemWidth:'200px',isShow:true};},methods: {handleEnter(){console.log('after-enter');},handleLeave(){console.log('after-leave');},handleAppear(){console.log('appear');},handleEnter(){console.log('enter');},handleLeave(){console.log('leave');},myEnter(){console.log('before-enter');},myhandleEnter(){console.log('after-appear');},},components: {ComponentA,ComponentB},}
</script><style lang="less" scoped>
// @import '~@assets/less/common.less';h1{background-color: rgb(98, 57, 133);}
//进入的起点
.mez-enter,.mez-leave-to{transform: translateX(-100%);
}
//进入的过程
.mez-enter-active,.mez-leave-active{// animation: identifier 1s linear;transition: 0.5s linear;
}
// .mez-leave-active{
//     // animation: identifier 1s linear reverse;
// }
//进入的终点
.mez-enter-to,.mez-leave{transform: translateX(0);
}
//离开的起点
// .mez-leave{
//     transform: translateX(0);
// }
// //离开的终点
// .mez-leave-to{
//     transform: translateX(-100%);
// }// @keyframes identifier {
//     from{
//         transform: translateX(-100%);
//     }
//     to{
//         transform: translateX(0px);
//     }
// }
</style>

子组件brotherA.vue:

template>
<div>兄弟A组件<!-- <a-button type="primary" size="default" @click="handleClick">点我给B兄弟传值</a-button> --><slot name="top">如果父组件没有内容显示我</slot>
</div>
</template><script>
export default {name: '',data() {return {};},methods: {// handleClick() {//   this.$emit('sendValue', '兄弟A组件传给B的参数');// }}
}
</script><style scoped></style>

来看效果:

果然和脚手架有关,可以正常使用。在vue3项目中哪怕是写成了不是setup语法糖的写法,也是不能正常显示,这里兄弟们需要注意一下,也有可能是我用vite建立的是vue3的项目,因为既有vue3的setup语法糖写法,又有vue2的export default{}写法,造成的冲突。【另外,这里还有一个vue2.7还是啥来着提出的配合template的<template v-slot:插槽名></template>的简写写法,这个就不展开说了,知道就行。】

③作用域插槽

 它是一种特殊的插槽,允许子组件爱你将数据暴露给父组件的插槽内容。在子组件中,语法为<slot :数据名=“数据值”></slot>的写法将自己的数据传递给插槽。

而在父组件中,通过<template v-slot:插槽名称=“slotProps”>接受数据,并使用slotProps来访问传递过来的数据。

子组件:

<template><div><slot :users="userList"></slot></div>
</template><script setup>
import { reactive } from 'vue';// 定义一个响应式数组,作为作用域插槽的数据源
const userList = reactive([{ name: 'Alice', age: 25 },{ name: 'Bob', age: 30 },{ name: 'Charlie', age: 35 }
]);
</script><style scoped>
/* 子组件的样式(如果需要的话) */
</style>

父组件:

<template><div><h1>作用域插槽示例</h1><ChildComponent><!-- 使用 v-slot 接收作用域插槽的数据 --><template #default="{ users }"><ul><li v-for="user in users" :key="user.name">{{ user.name }} - {{ user.age }}</li></ul></template></ChildComponent></div>
</template><script setup>
import ChildComponent from './ChildComponent.vue';
</script><style scoped>
/* 父组件的样式(如果需要的话) */
</style>

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

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

相关文章

unity3d————Resources异步加载

知识点一&#xff1a;Resources异步加载是什么&#xff1f; 在Unity中&#xff0c;资源加载可以分为同步加载和异步加载两种方式。同步加载会在主线程中直接进行&#xff0c;如果加载的资源过大&#xff0c;可能会导致程序卡顿&#xff0c;因为从硬盘读取数据到内存并进行处理…

fatal error C1083: 无法打开包括文件: “stdio.h”: No such file or directory

在 Windows 上的 “终端” 里&#xff0c;对于已经执行过 cmake -S . -B build -G Ninja 的工程&#xff0c;执行了 cmake --build build出现了报错&#xff1a; fatal error C1083: 无法打开包括文件: “stdio.h”: No such file or directory 原因是&#xff0c;当前 “终端…

SpringBoot+Vue3实现数据可视化大屏

前端工程的地址:UserManagerFront: 数据可视化前端 (gitee.com) 效果展示&#xff0c;可以展现出来了&#xff0c;样式可能还有一些丑。 后端代码 后端主要是拿到数据并对数据进行处理&#xff0c;按照前端需要的格式进行返回即可。 import com.njitzx.entity.Student; impor…

vue3: toRef, reactive, toRefs, toRaw

vue3&#xff1a; toRef, reactive, toRefs, toRaw 扫码或者点击文字后台提问 <template><div>{{ man }}</div><hr><!-- <div>{{ name }}--{{ age }}--{{ like }}</div> --><div><button click"change">修…

《网络硬件设备完全技术宝典》

《网络硬件设备完全技术宝典》 网卡 集线器 交换机 路由器 双绞线 光缆 无线接入点AP 交换机技术与选择策略 冗余链路技术 由于物理链路和网络模块的损坏都将导致网络链路的失败&#xff0c;因此两个设备之间&#xff0c;特别是核心交换机与汇聚交换机之间的单链路…

Win10下使用Anaconda安装GPU版本PyTorch

PyTorch是一个开源机器学习框架&#xff0c;最初来自Meta Ai。如果你想研究人工智能或从事人工智能项目方面的工作&#xff0c;那么在本地机器上使用PyTorch设置开发环境对于许多项目来说都是必不可少的。GPU&#xff08;图形处理单元&#xff09;是一种专用处理器&#xff0c;…

灰狼优化算法

灰狼优化算法&#xff08;Grey Wolf Optimizer&#xff0c;GWO&#xff09;是一种群智能优化算法&#xff0c;由澳大利亚格里菲斯大学学者Mirjalili等人于2014年提出。该算法灵感来源于灰狼群体的捕食行为&#xff0c;通过模拟灰狼的社会等级分层、跟踪、包围和攻击猎物等步骤来…

Chromium 中sqlite数据库操作演示c++

本文主要演示sqlite数据库 增删改查创建数据库以及数据库表的基本操作&#xff0c;仅供学习参考。 一、sqlite数据库操作类封装&#xff1a; sql\database.h sql\database.cc // Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-sty…

Docker部署Kafka集群,增加 SASL_SSL认证,并集成到Spring Boot,无Zookeeper版

1&#xff0c;准备好Kafka 镜像包&#xff1a; bitnami/kafka:3.9.0 镜像资源包 2&#xff0c;准备好kafka.keystore.jks 和 kafka.truststore.jks证书 具体操作可参考&#xff1a; Docker部署Kafka SASL_SSL认证&#xff0c;并集成到Spring Boot-CSDN博客 3&#xff0c;配置…

apipost下载安装教程、脚本详细使用教程

目录 apipost脚本使用教程 缘由&#xff1a; 实现流程&#xff1a; 1、设置接口需要的URL&#xff1a; 2、boby: 3、预执行操作&#xff1a; 4、断言 5、执行结果&#xff1a; 什么是ApiPost&#xff1f; 下载以及安装&#xff1a; apipost使用文档介绍&#xff1a;…

Python Web 应用开发基础知识

Python Web 应用开发基础知识 引言 随着互联网的快速发展&#xff0c;Web 应用程序的需求日益增加。Python 作为一种简单易学且功能强大的编程语言&#xff0c;已经成为 Web 开发中广受欢迎的选择之一。本文将深入探讨 Python Web 开发的基础知识&#xff0c;包括常用框架、基…

SpringBoot多环境+docker集成企业微信会话存档sdk

SpringBoot多环境docker集成企业微信会话存档sdk 文章来自于 https://developer.work.weixin.qq.com/community/article/detail?content_id16529801754907176021 SpringBoot多环境docker集成企业微信会话存档sdk 对于现在基本流行的springboot环境&#xff0c;官方文档真是比…

在openi平台 基于华为顶级深度计算平台 openmind 动手实践

大家可能一直疑问&#xff0c;到底大模型在哪里有用。 本人从事的大模型有几个方向的业务。 基于生成式语言模型的海事航行警告结构化解析。 基于生成式语言模型的航空航行警告结构化解析。 基于生成式生物序列&#xff08;蛋白质、有机物、rna、dna、mrna&#xff09;的多模态…

【论文分享】基于街景图像识别和深度学习的针对不同移动能力老年人的街道步行可达性研究——以南京成贤街社区为例

全球老龄化趋势加剧, 许多城市中老年人数量不断增加&#xff0c;而现有街道和社区基础设施往往未能满足其步行安全和便利需求。本次我们给大家带来一篇SCI论文的全文翻译&#xff0c;该论文通过探讨不同步行能力的老年人对城市步行环境的需求&#xff0c;提供了关于如何改善城市…

Android Osmdroid + 天地图 (二)

Osmdroid 天地图 &#xff08;二&#xff09; 前言正文一、定位监听二、改变地图中心三、添加Marker四、地图点击五、其他配置① 缩放控件② Marker更换图标③ 添加比例尺④ 添加指南针⑤ 添加经纬度网格线⑥ 启用旋转手势⑦ 添加小地图 六、源码 前言 上一篇中我们显示了地图…

CSS基础知识04

文本溢出通常是指在限定的空间内不能容纳所输入的文字&#xff0c;导致文字超出了容器的边界 一、文本溢出 1.1.css属性处理 所用到的属性 属性属性值overflowvisible&#xff1a;默认值&#xff0c;内容不会被修剪&#xff0c;会呈现在元素框之外。hidden&#xff1a;内容会…

gitlab和jenkins连接

一&#xff1a;jenkins 配置 安装gitlab插件 生成密钥 id_rsa 要上传到jenkins&#xff0c;id_rsa.pub要上传到gitlab cat /root/.ssh/id_rsa 复制查看的内容 可以看到已经成功创建出来了对于gitlab的认证凭据 二&#xff1a;配置gitlab cat /root/.ssh/id_rsa.pub 复制查…

Modbus TCP转Modbus ASCII解决方案

Modbus TCP和Modbus ASCII是两种不同的通信协议。Modbus TCP是一种二进制协议&#xff0c;Modbus ASCII是一种基于文本的协议。二者不能直接转换&#xff0c;因为它们的数据表示方式、消息结构、字符编码等都不相同。 如果你需要将Modbus TCP转换为Modbus ASCII&#xff0c;你…

十三、注解配置SpringMVC

文章目录 1. 创建初始化类&#xff0c;代替web.xml2. 创建SpringConfig配置类&#xff0c;代替spring的配置文件3. 创建WebConfig配置类&#xff0c;代替SpringMVC的配置文件4. 测试功能 1. 创建初始化类&#xff0c;代替web.xml 2. 创建SpringConfig配置类&#xff0c;代替spr…

全新升级!立迈胜STMP57系列防水一体化步进伺服电机:IP65+多圈绝对值编码器+EtherCAT通信+内置刹车

在这个科技日新月异的时代&#xff0c;每一步创新都意味着行业的一次飞跃。 回想当初&#xff0c;我们做防水电机的初衷只是因为客户的应用场景涉水&#xff0c;从而定做了IP65防护等级的一体式电机。 后来发现很多客户也有类似的需求&#xff0c;比如机械加工、户外照明、自…