Vue 插槽 slot

solt 插槽需要分为 2.6.0 版本以上和 2.6.0版本以下。

2.6.0 版本以下的 slot 插槽在,2.x版本将继续支持,但是在 Vue 3 中已被废弃,且不会出现在官方文档中。

作用

插槽 prop 允许我们将插槽转换为可复用的模板,这些模板可以基于输入的 prop ( 也就是在使用者中传递的内容 ) 渲染出不同的内容。这在设计封装数据逻辑同时允许父级组件自定义部分布局的可复用组件时是最有用的。

2.6.0 版本及以上

 在 2.6.0 中,Vue 为具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。它取代了 slot 和 slot-scope 这两个目前已被废弃但未被移除且仍在文档中的 attribute。

默认插槽: 当组件中未提供任何插槽内容时,展示默认的内容。如提供了内容,则替代默认内容  ( 只管挖坑,不管怎么用,反正我都丢进去)

 Category 组件:分类组件,插槽中提供默认内容

<template><div><p>游戏列表</p><slot>当没有外部内容填充时,我会展示</slot></div>
</template>

 App 组件:使用  Category 组件,且不提供插槽内容。

<template><div id="app"><Category/></div>
</template>

只展示默认内容。 

 当 App 组件中提供插槽内容时:Category 组件就不能使用自闭合,需要使用双标签形式。此时 Vue 会将 组件标签中 的内容在 App 组件中解析完成之后,丢到 Category 组件 中,将 slot 替换

<template><div id="app"><Category><p>这是 App 组件提供的内容</p>  </Category></div>
</template>

提供的内容会覆盖默认内容 

具名插槽:顾名思义就是有个名字的插槽( 给这个坑取了个名字,使用的时候可以指定往这个坑里面填东西 ) --- v-slot:xxx 只能存在于  <template> 标签中 ( ps : 存在一种情况可以直接写在组件标签上)

Category 组件:分类组件,插槽中提供 name 属性,作为该插槽名称。若是不提供 name 属性,则默认带有隐含的名字“default”,作为默认插槽

<template><div><p>游戏列表</p><slot name="header">这是头部</slot> <br><slot>这是内容</slot> <br></div>
</template>

App组件:通过 v-slot 指令,绑定对应的插槽名称 ( name 属性),就能将内容分发到指定插槽中。

<template><div id="app"><Category><template  v-slot:header><p>传递的头部</p></template><template><p>传递的内容</p></template></Category></div>
</template>

 但是,如果 Category 组件中存在多个 slot 插槽,任何没有被包裹在带有 v-slot 的 <template> 中的内容都会被视为默认插槽的内容。

具名插槽也可以和 v-bind 、v-on 一样进行缩写,v-slot: 缩写成 #。如下所示。但是切记一点:如果你想使用缩写,那么必须给一个明确的插槽name,即使是 default 也要写上。要么就不写#,直接为默认插槽,否则会报错

// 全写
<Category><template v-slot:gameList>xxx</template>
</Category>// 简写
<Category><template #gameList>xxx</template>
</Category>// 默认插槽简写完整
<Category><template #default>xxx</template>
</Category>// 默认插槽简写不完整报错
<Category><template #>xxx</template>
</Category>

 作用域插槽:在使用组件时,让使用者中提供的插槽内容能够访问子组件中才有的数据。父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

 Category 组件:分类组件,组件中带有游戏分类数据。

<template><div><p>游戏列表</p><slot></slot></div>
</template><script>
export default {data() {return {games:['lol','dota','刺客信条','只狼']}},
}
</script>

App 组件:使用 Category 组件中的数据渲染出不同的效果、分别渲染为 有序列表,无序列表、h4

<template><div id="app"><Category><ul><li v-for="(game,index) in games" :key="index"><p>{{ game }}</p></li></ul></Category></div>
</template>

代码写的很流畅,看起来完全没毛病,但是控制台报错了啊。 

 翻译过来就是:属性或方法“games”不是在实例中定义的,而是在渲染过程中引用的。通过初始化属性,确保该属性是可响应的,无论是在data选项中,还是对于基于类的组件。

这说明了啥?在 App 组件中报了这个错,games 不存在,肯定不存在啊,我的 games 数据是存在 <Category> 组件中的啊,在 <Category> 组件中随便你怎么使用都没毛病。但是 App 组件自己没定义,还要强行使用,那咋行。

所以 Vue 使用了 v-bind 指令( 简写为 : ),让 使用者App组件 能够访问到被使用者 <Category> 组件中的数据

<Category> 组件中,通过 v-bind 指令给 slot 插槽绑定了 games 属性,传递的数据就是 games。从此, <Category> 组件 的使用者,只要接收 games 数据,就可以使用。

<template><div><p>游戏列表</p><slot v-bind:games="games"></slot><!-- <slot :games="games"></slot> --></div>
</template>

App组件,通过使用 <Category> 组件,且在  <template> 标签中 通过 v-slot 指令获取数据即可使用。( 这里的 :default 对应上面的,当 slot 插槽未指定 name 属性时,默认自带 default ,可以省略。如果是具名插槽,则指定 对应的 name 属性进行渲染 )

<template><div id="app"><Category><template v-slot:default='slotProps'><!-- <template v-slot='slotProps'> --><ul><li v-for="(game, index) in slotProps.games" :key="index"><p>{{ game }}</p></li></ul></template></Category></div>
</template>

 <template> 标签中 通过 v-slot='slotProps' 接收了这个 slotProps,这个名字是随便定义的,对应的就是  <Category> 组件中 <slot> 中绑定的 games 数据。slotProps 是一个对象,键值对就是绑定的 { games:['lol','dota','刺客信条','只狼'] }。所以在使用中,还需要通过  slotProps.games 。 

 当然,也存在简写方式,那就是 es6 的解构。可以将 slotProps 中的值解构出来直接使用。也可以 重命名,添加默认值等 解构赋值的常用操作

// 单纯解构
<Category><template v-slot:default={games}><ul><li v-for="(game, index) in games" :key="index"><p>{{ game }}</p></li></ul></template>
</Category>// 解构 + 重命名 将 games 重命名未 aaa
<Category><template v-slot={games:aaa}>xxx</template>
</Category>// 解构 + 设置默认值
<Category><template v-slot={games:['恐龙快打']}>xxx</template>
</Category>

动态插槽名:当你的插槽名称不固定,而是根据情况而变化时,你就需要使你的插槽名称是动态的

在 官方文档--模板语法--指令中,存在一个动态参数,具体如下,限制内容请查看文档。

// 这里的 attributeName 会被作为一个 JavaScript 表达式进行动态求值,求得的值将
// 会作为最终的参数来使用。例如,如果你的 Vue 实例有一个 attributeName,其值为 "href",
// 那么这个绑定将等价于 v-bind:href。
<a v-bind:[attributeName]="url"> ... </a>

所以 <slot> 插槽也借鉴了这个方法,实现了 动态插槽名

<Category><template v-slot:[这是动态插槽名称]>xxx</template>
</Category>

 独占默认插槽:在传递数据的前提下,如果被提供的内容只有默认插槽时组件的标签才可以被当作插槽的模板来使用。之前说过 v-slot 必须写在   <template> 标签中,只有一种情况除外,说的就是这个情况。

如果我的 <Category> 组件 中只存在一个默认插槽。且传递了数据

<template><div><p>游戏列表</p><slot :games="games"></slot></div>
</template>

那么这个默认插槽在被使用时,v-slot 指令,可以直接作用在 <Category> 组件标签上,可以简写为 <Category v-slot={games}>

<template><div id="app"><Category v-slot:default={games}>{{ games }}</Category></div>
</template>

这里说一下为啥需要这个 games:如果不接受参数,那是不是就直接是默认插槽,都默认插槽了,还写个锤子的 v-slot 指令啊,直接怼代码不就完事了。

2.6.0版本以下语法

事先声明,在接下来所有的 2.x 版本中 slot 和 slot-scope 属性仍会被支持,但已经被官方废弃且不会出现在 Vue 3 中。

slot:类比于上面的 v-solt,作用于具名插槽与默认插槽,与 v-solt 不同的是,solt 可以写在 <template> 标签中,也可以使用在一个普通元素上。不存在简写方式。

<Category> 组件中存在三个插槽,一个是默认插槽,两个是具名插槽

<template><div><p>游戏列表</p><slot name="header"></slot><slot></slot><slot  name="footer"></slot></div>
</template>

App 组件中,分别用 <template> 标签 + slot 指定具名插槽 header,普通元素 p 标签 + slot 指定具名插槽 footer,纯元素的默认插槽,来实现效果

<template><div id="app"><Category><template slot='header'>这是头部</template><p>这是内容</p><p slot="footer">这是底部</p></Category></div>
</template>

 展示结果如下,具名插槽一一对应,默认插槽内容页分发到了正确位置。

slot-scope:作用域插槽,同样可以写在 <template> 标签中,也可以使用在一个普通元素上。用法和新版本的 v-slot 作用域插槽一致,可以解构,只是语法不一致

<Category> 组件中存在只存在一个具名插槽,且通过 v-bind: 绑定数据

<template><div><p>游戏列表</p><slot name="header" v-bind="games"></slot></div>
</template>

App 组件中, 通过 slot-scope 接收参数,通过 slot 指定具名插槽 进行渲染。

<Category><template slot='header' slot-scope="games">{{ games }}</template>
</Category>

通过作用域插槽,可以实现 在复用模板的情况下,渲染出不同的 布局和样式。因为 作用域插槽的渲染实际上是受 父级使用者控制的。将数据传递给 使用者后,使用者可以在自己主见内部随意使用,任意布局。

<Category> 组件中代码不变

<template><div><p>游戏列表</p><slot name="header" v-bind="games"></slot></div>
</template>

App 组件中 使用 <Category> 组件 进行不同的布局

<template><div id="app"><Category><template slot='header' slot-scope="games"><ul><li v-for="(item,index) in games" :key="index">{{ item }}</li></ul></template></Category><Category><template slot='header' slot-scope="games"><span style="color:red" v-for="(item,index) in games" :key="index">{{ item }}</span></template></Category></div>
</template>

 这就是插槽的便利之处

 

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

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

相关文章

Qt应用开发(基础篇)——LCD数值类 QLCDNumber

一、前言 QLCDNumber类继承于QFrame&#xff0c;QFrame继承于QWidget&#xff0c;是Qt的一个基础小部件。 框架类QFrame介绍 QLCDNumber用来显示一个带有类似lcd数字的数字&#xff0c;适用于信号灯、跑步机、体温计、时钟、电表、水表、血压计等仪器类产品的数值显示。 QLCDNu…

【CSS】文本效果

文本溢出、整字换行、换行规则以及书写模式 代码&#xff1a; <style> p.test1 {white-space: nowrap; width: 200px; border: 1px solid #000000;overflow: hidden;text-overflow: clip; }p.test2 {white-space: nowrap; width: 200px; border: 1px solid #000000;ove…

2023年Q2天猫洗衣机行业品牌销售排行榜(淘宝天猫数据)

洗衣机作为普及率极高的家电之一&#xff0c;如今已经成为我们生活中不可或缺的一部分。由于洗衣机的普及率较高&#xff0c;因此虽其市场规模庞大&#xff0c;但如今要使洗衣机呈现规模化增长的可能性还是比较小的。不过&#xff0c;随着用户需求及产品的升级&#xff0c;洗衣…

Apipost接口测试断言

常用断言直接点右边栏 断言list&#xff1a; // 断言json数组长度 apt.assert(response.json.data.data.length20); // 断言json数组中的某个对象 apt.assert(response.json.data.data[0].docid1482);

EvilBox One靶场笔记

EvilBox: One靶场笔记 信息收集 先fscan找主机192.168.1.102 namp扫端口 开放80,22端口 然后扫目录 └─$ gobuster dir -r -u http://192.168.1.102/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,bak,html在扫secret目录&#xff0c;找…

基于Kubeadm部署k8s集群:下篇

继续上篇内容 目录 7、安装flannel 8、节点管理命令 三、安装Dashboard UI 1、部署Dashboard 2、开放端口设置 3、权限配置 7、安装flannel Master 节点NotReady 的原因就是因为没有使用任何的网络插件&#xff0c;此时Node 和Master的连接还不正常。目前最流行的Kuber…

微服务04-elasticsearch

1、es概念 1.1 文档和字段 elasticsearch是面向**文档(Document)**存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中: 而Json文档中往往包含很多的字段(Field),类似于数据库中的列。 1.2 索引和映射 索引(…

Visual Studio 2019 详细安装教程(图文版)

前言 Visual Studio 2019 安装包的下载教程、安装教程 教程 博主博客链接&#xff1a;https://blog.csdn.net/m0_74014525 关注博主&#xff0c;后期持续更新系列文章 ********文章附有百度网盘安装包链接********* 系列文章 第一篇&#xff1a;Visual Studio 2019 详细安装教…

Spark(39):Streaming DataFrame 和 Streaming DataSet 输出

目录 0. 相关文章链接 1. 输出的选项 2. 输出模式(output mode) 2.1. Append 模式(默认) 2.2. Complete 模式 2.3. Update 模式 2.4. 输出模式总结 3. 输出接收器(output sink) 3.1. file sink 3.2. kafka sink 3.2.1. 以 Streaming 方式输出数据 3.2.2. 以 batch …

树状结构数据,筛选指定数据

问题描述&#xff1a; 应用场景和需求&#xff1a;对一个树状结构的数据&#xff0c;进行CRUD 时&#xff0c;想筛选出 树状结构数据中存在变动的部分。 操作步骤 准备需要的数据&#xff1a; 1.先拿到 你原来的树状结构数据 2.再筛选出 需要保留的数据集合id&#xff0c;也…

开源力量再现,国产操作系统商业化的全新探索

文章目录 1. 开源运动的兴起2. 开源力量的推动3. 国产操作系统的崭露头角3.1 国产操作系统有哪些 4.国产操作系统的商业化探索5.开源力量对国产操作系统商业化的推动 操作系统作为连接硬件、中间件、数据库、应用软件的纽带&#xff0c;被认为是软件技术体系中最核心的基础软件…

Tomcat的动静分离以及多实例部署

一、动静分离 Nginx实现负载均衡的原理&#xff1a; Nginx实现负载均衡是通过反向代理实现Nginx服务器作为前端&#xff0c;Tomcat服务器作为后端&#xff0c;web页面请求由Nginx服务来进行转发。 但不是把所有的web请求转发&#xff0c;而是将静态页面请求Ncinx服务器自己来处…

竞赛项目 深度学习实现语义分割算法系统 - 机器视觉

文章目录 1 前言2 概念介绍2.1 什么是图像语义分割 3 条件随机场的深度学习模型3\. 1 多尺度特征融合 4 语义分割开发过程4.1 建立4.2 下载CamVid数据集4.3 加载CamVid图像4.4 加载CamVid像素标签图像 5 PyTorch 实现语义分割5.1 数据集准备5.2 训练基准模型5.3 损失函数5.4 归…

【Gitee的使用】Gitee的简单使用,查看/创建SSH公匙、创建版本库、拉取代码、提交代码

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 本篇文章简单介绍&#xff0c;如何在Gitee上面创建版本库、拉取…

03微服务到底是什么

一句话导读 微服务是一种架构模式&#xff0c;英文翻译 microservice&#xff0c;微服务架构的核心理念是将大型、复杂的单体应用拆分成更小的、自治的组件&#xff0c;每个组件即为一个微服务 目录 一句话导读 一、微服务的定义 二、微服务的特点 1.独立性 2.松耦合 3.可伸…

如何投诉删除360搜索下拉词?

有的企业发现自己品牌在360搜索下拉框里会展现出来一些负面词&#xff0c;如骗子、跑路、倒闭等&#xff0c;有企业咨询能不能删除360搜索下拉里的负面词&#xff1f;小马识途营销顾问分析要看具体情况&#xff0c;按经验如果是涉及诋毁诽谤的词&#xff0c;投诉到平台能够删除…

【Paper Reading】CenterNet:Keypoint Triplets for Object Detection

背景 首先是借鉴Corner Net 表述了一下基于Anchor方法的不足&#xff1a; anchor的大小/比例需要人工来确认anchor并没有完全和gt的bbox对齐&#xff0c;不利于分类任务。 但是CornerNet也有自己的缺点 CornerNet 只预测了top-left和bottom-right 两个点&#xff0c;并没有…

Pytest三种运行方式

Pytest 运行方式共有三种&#xff1a; 1、主函数模式 运行所有 pytest.main() 指定模块 pytest.main([-vs],,./testcase/test_day1.py) 只运行testcase 下的test_day1.py 文件 指定目录 pytest.main([-vs]),./testcase) 只运行testcase 目录下的文件 通过nodeid指定用例…

Vue中data变量使用的注意事项

因为在Vue中&#xff0c;data中的属性往往都是用于双向绑定&#xff0c;所以Vue会对其有劫持&#xff0c;所以我们在对data属性进行操作时&#xff0c;尽量不要对其直接操作&#xff0c;比如下面代码&#xff1a; export default {data() {return {list: []}},methods: {init(…

h3c 7506 IRF和MAD多活配置案例

IRF配置 irf mac-address persistent always irf auto-update enable irf auto-merge enable undo irf link-delay irf member 1 priority 1 irf member 2 priority 32 irf mode normal irf-port 1/2 port group interface Ten-GigabitEthernet1/1/0/39 mode enhanced port g…