第二十四节:带你梳理Vue2 : Vue具名插槽/作用域插槽/v-slot指令


1. 具名插槽

1.1 没有使用具名插槽的问题

有的时候我们在使用子组件时,在子组件模板上不同的位置插入不同的内容, 只有一个插槽显然没法满足我们的需求,看示例:

需求如下:

  1. 子组件是一篇文章的结构
  2. 父组件在调用子组件是给文章插入标题,正文,时间信息

示例代码如下:

<div id="app"><!-- 使用组件 --><my-child ><h2>这是一篇介绍vue插槽的文章</h2><p>这是文章的第一段</p><p>这是文章的第二段内容</p><p>这是文章的第三段内容</p><span>2020年5月1日</span></my-child></div><!-- 组件模板 -->
<template id="mychild"><div class="article"><div class="title"><slot></slot></div><div class="contont"><slot></slot></div><div class="time"><slot></slot></div></div>
</template><script>//  组件选项对象let MyChild = {template: `#mychild`};//  实例中注册组件const vm = new Vue({el:"#app",components: {MyChild}})</script>

结果:

具名插槽.png

示例结果说明:

  1. 通过示例结果发现和我们想的天差地别,此时每一个插槽都插入了所有的内容, 显然不符合预期
  2. 那么我们怎样才能将分发的内容指定到每一个具体的插槽上呢.

这个时候我们就需要给每个插槽指定名字


1.2 使用具名插槽和默认插槽

<slot> 元素可以用一个特殊的特性 name 来进一步配置如何分发内容。多个插槽可以有不同的名字。具名插槽将匹配内容片段中有对应 slot 特性的元素。

未使用name属性的slot插槽被称匿名插槽, 也可以叫做默认插槽. 我们在子组件中仍然可以有一个匿名插槽,作为找不到匹配的内容片段的备用插槽。如果没有默认插槽,这些找不到匹配的内容片段将被抛弃。

使用具名操作重写上面的示例:

<div id="app"><!-- 使用组件 --><my-child ><h2 slot="title">这是一篇介绍vue插槽的文章</h2><p>这是文章的第一段</p><p>这是文章的第二段内容</p><p>这是文章的第三段内容</p><span slot="time">2020年5月1日</span></my-child></div><!-- 组件模板 -->
<template id="mychild"><div class="article"><div class="title"><slot name="title">这里是标题内容的插槽</slot></div><div class="contont"><slot>这里是默认插槽</slot></div><div class="time"><slot name="time">这里是时间的插槽</slot></div></div>
</template><script>//  组件选项对象let MyChild = {template: `#mychild`};//  实例中注册组件const vm = new Vue({el:"#app",components: {MyChild}})
</script>

结果:

具名插槽2.png

此时我们就会发现,分发的内容以及正常插入到对应的插槽上了

通过上面的例子我们就知道了,slot如果没有显示的使用name属性指定插槽的名字,那么slot默认有个名字default,默认插槽,如果在分发内容时,没有指定插槽,所有的内容都将默认插到默认插槽上


2. 作用域插槽

2.1 作用插槽的理解和使用

通过学习我们知道,插槽的内容最后是在子组件模板上渲染的, 那么就会在有得时候需要在分发的内容中使用子组件中才有的数据,怎么办呢. 这个时候就要用到作用域插槽了

作用域插槽是一种特殊类型的插槽,用作一个 (能被传递数据的) 可重用模板,来代替已经渲染好的元素。

简而言之,就是利用slot 标签将子组件的数据传递到分发内中上,就像prop传递数据给组件一样


在父级中,具有特殊特性 slot-scope<template> 元素必须存在,表示它是作用域插槽的模板。slot-scope 的值将被用作一个临时变量名,此变量接收从子组件传递过来的 props 对象:

示例:

<div id="app"><!-- 使用组件 --><my-child ><template slot-scope="props"><button>{{ props.text }}</button></template></my-child></div><!-- 组件模板 -->
<template id="mychild"><div><slot :text="text"></slot></div>
</template><script>//  组件选项对象let MyChild = {template: `#mychild`,data(){return {text: "提交"}}};//  实例中注册组件const vm = new Vue({el:"#app",components: {MyChild}})</script>

在 2.5.0+,slot-scope 能被用在任意元素或组件中而不再局限于 <template>

也就意味着可以如下写法

<div id="app"><!-- 使用组件 --><my-child ><button slot-scope="props">{{ props.text }}</button></my-child>
</div>

显示结果

作用域插槽.png


2.2 作用域插槽也可以使用解构写法

<div id="app"><!-- 使用组件 --><my-child ><button slot-scope="{text}">{{ text }}</button></my-child>
</div>

很遗憾的告诉你, 具名插槽和作用域插槽的用法在未来即将被废弃?

What? 那么我们怎么处理具名插槽和作用域插槽取消后留下的问题呢? 不用担心,往下看.


3. v-slot指令

v-slot 指令自 Vue 2.6.0 起被引入,提供更好的支持 slotslot-scope attribute 的 API 替代方案。v-slot 完整的由来参见这份 RFC。在接下来所有的 2.x 版本中 slotslot-scope attribute 仍会被支持,但已经被官方废弃且不会出现在 Vue 3 中。


3.1 使用v-slot处理具名插槽的问题

在向具名插槽提供内容的时候,我们可以在一个 <template> 元素上使用 v-slot 指令,并以 v-slot 的参数的形式提供其名称:

<div id="app"><!-- 使用组件 --><my-child ><template v-slot:title><h2>这是一篇介绍vue插槽的文章</h2></template><p>这是文章的第一段</p><p>这是文章的第二段内容</p><p>这是文章的第三段内容</p><template v-slot:time><span>2020年5月1日</span></template></my-child></div><!-- 组件模板 -->
<template id="mychild"><div class="article"><div class="title"><slot name="title">这里是标题内容的插槽</slot></div><div class="contont"><slot>这里是默认插槽</slot></div><div class="time"><slot name="time">这里是时间的插槽</slot></div></div>
</template><script>//  组件选项对象let MyChild = {template: `#mychild`};//  实例中注册组件const vm = new Vue({el:"#app",components: {MyChild}})
</script>

显示结果:

v-slot指令处理具名插槽的功能.png

现在 <template> 元素中的所有内容都将会被传入相应的插槽。任何没有被包裹在带有 v-slot<template> 中的内容都会被视为默认插槽的内容。


如果你希望更明确一些,仍然可以在一个 <template> 中包裹默认插槽的内容:

<div id="app"><!-- 使用组件 --><my-child ><template v-slot:title><h2>这是一篇介绍vue插槽的文章</h2></template><template v-slot:default><p>这是文章的第一段</p><p>这是文章的第二段内容</p><p>这是文章的第三段内容</p></template><template v-slot:time><span>2020年5月1日</span></template></my-child></div>

注意 v-slot 只能添加在 上


3.2 使用v-slot处理作用域插槽的问题

绑定在 <slot> 元素上的 attribute 被称为插槽 prop。现在在父级作用域中,我们可以使用带值的 v-slot 来定义我们提供的插槽 prop 的名字:

<div id="app"><!-- 使用组件 --><my-child ><template v-slot:default="props"><button>{{ props.text }}</button></template></my-child>
</div><!-- 组件模板 -->
<template id="mychild"><div><slot :text="text"></slot></div>
</template><script>//  组件选项对象let MyChild = {template: `#mychild`,data(){return {text: "提交"}}};//  实例中注册组件const vm = new Vue({el:"#app",components: {MyChild}})</script>

显示结果

v-slot处理作用域插槽功能.png


3.3 作用域插槽的特殊处理

在上述情况下,当被提供的内容只有默认插槽时,组件的标签才可以被当作插槽的模板来使用。这样我们就可以把 v-slot 直接用在组件上:

<div id="app"><!-- 使用组件 --><my-child v-slot:default="props"><button>{{ props.text }}</button></my-child>
</div>

这种写法还可以更简单。就像假定未指明的内容对应默认插槽一样,不带参数的 v-slot 被假定对应默认插槽:

<div id="app"><!-- 使用组件 --><my-child v-slot="props"><button>{{ props.text }}</button></my-child>
</div>

这用这种简单语法的情况就是在组件中只有一个默认插槽,一但有多个插槽,请使用完整的语法


4. 动态插槽

2.6.0 新增

动态指令参数也可以用在 v-slot 上,来定义动态的插槽名:

还是以我们刚才文章的那个多插槽为例;

<div id="app"><!-- 使用组件 --><my-child ><template v-slot:[head]><h2>这是一篇介绍vue插槽的文章</h2></template><p>这是文章的第一段</p><p>这是文章的第二段内容</p><p>这是文章的第三段内容</p><template v-slot:[food]><span>2020年5月1日</span></template></my-child></div><!-- 组件模板 -->
<template id="mychild"><div class="article"><div class="title"><slot name="title">这里是标题内容的插槽</slot></div><div class="contont"><slot>这里是默认插槽</slot></div><div class="time"><slot name="time">这里是时间的插槽</slot></div></div>
</template><script>//  组件选项对象let MyChild = {template: `#mychild`};//  实例中注册组件const vm = new Vue({el:"#app",data:{head:"title",food:"time"},components: {MyChild}})
</script>

此时template 标签上的v-solt指令参数是一个中括号, 中括号里的值将是一个变量,为当前父组件的数据


5. 具名插槽的缩写

2.6.0 新增

v-onv-bind 一样,v-slot 也有缩写,即把参数之前的所有内容 (v-slot:) 替换为字符 #。例如 v-slot:header 可以被重写为 #header

<div id="app"><!-- 使用组件 --><my-child ><template #title><h2>这是一篇介绍vue插槽的文章</h2></template><p>这是文章的第一段</p><p>这是文章的第二段内容</p><p>这是文章的第三段内容</p><template #time><span>2020年5月1日</span></template></my-child></div>

然而,和其它指令一样,该缩写只在其有参数的时候才可用。这意味着以下语法是无效的:

<my-child ><!-- 这种写法无效 --><template #="props"><h2>这是一篇介绍vue插槽的文章</h2></template>
</my-child>

如果你希望使用缩写的话,你必须始终以明确插槽名取而代之:

<my-child ><!-- 这种写法有效,因为有指令参数 --><template #deatule="props"><h2>这是一篇介绍vue插槽的文章</h2></template>
</my-child>

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

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

相关文章

【强化学习的数学原理】课程笔记--1(基本概念,贝尔曼公式)

目录 基本概念State, Action, State transitionPolicy, Reward, Trajectory, Discount ReturnEpisodeMarkov decision process 贝尔曼公式推导确定形式的贝尔曼公式推导一般形式的贝尔曼公式State ValueAction Value 一些例子贝尔曼公式的 Matric-vector form贝尔曼公式的解析解…

Elasticsearch 索引与文档操作实践指南

上节我们部署了elasticsearch8.4.1和kibana8.4.1以及ik分词器&#xff0c;本节我们来学习下elasticsearch的相关索引&#xff0c;文档操作。 首先我们kinana的主界面找到开发者工具在里面我们来编写相关操作。 标题查看集群情况 GET /_cluster/health详细解释&#xff1a; …

云计算【第一阶段(18)】磁盘管理与文件系统 分区格式挂载(一)

目录 一、磁盘基础 二、磁盘结构 2.1、机械硬盘 2.2、固态硬盘 2.3、扩展移动硬盘 2.4、机械磁盘的一些计算&#xff08;了解&#xff09; 2.5、磁盘接口类型 二、Linux 中使用的文件系统类型 2.1、磁盘分区的表示 2.1.1、主引导记录(MBR) 2.1.2、Linux中将硬盘、分…

【十二】图解 Spring 核心数据结构:BeanDefinition

图解 Spring 核心数据结构&#xff1a;BeanDefinition 简介 使用spring框架的技术人员都知道spring两个大核心技术IOC和AOP&#xff0c;随着投入更多的时间去学习spring生态&#xff0c;越发觉得spring的发展不可思议&#xff0c;一直都是引领着Java EE的技术变革&#xff0c;这…

麒麟信安系统关闭core文件操作

在使用麒麟信安系统时&#xff0c;如果应用程序运行过程中崩溃了&#xff0c;此时并不会导致内核崩溃&#xff0c;只会在tmp目录下产生崩溃数据&#xff0c;如下图 不过tmp目录下的分区容量有限&#xff0c;当崩溃的应用core文件过大时将会占用tmp空间&#xff0c;导致tmpfs分区…

Msql----表的约束

提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、表的约束 表的约束&#xff1a;表中一定要有约束&#xff0c;通过约束让插入表中的数据是符合预期的。它的本质是通过技术手段&#xff0c;让程序员插入正确的数据&#xff0c;约束的最终目标是保证…

NAPI篇【4】——NAPI应用点亮一个LED

OpenHarmony的NAPI功能为开发者提供了JS与C/C不同语言模块之间的相互访问&#xff0c;交互的能力&#xff0c;使得开发者使用C或者C语言实现应用的关键功能。如操作开发板中某个GPIO节点的状态&#xff08;OpenHarmony并没有提供直接操作GPIO口状态的API&#xff09;&#xff0…

【Flink metric(3)】chunjun是如何实现脏数据管理的

文章目录 一. 基础逻辑二. DirtyManager1. 初始化2. 收集脏数据并check3. 关闭资源 三. DirtyDataCollector1. 初始化2. 收集脏数据并check3. run&#xff1a;消费脏数据4. 释放资源 四. LogDirtyDataCollector 一. 基础逻辑 脏数据管理模块的基本逻辑是&#xff1a; 当数据消…

猫咪也怕油腻?选对猫粮是关键!福派斯鲜肉猫粮守护猫咪健康

亲爱的猫友们&#xff0c;我们都知道&#xff0c;猫咪的饮食健康是每一个铲屎官都非常关心的问题。最近&#xff0c;有些猫友向我反映&#xff0c;他们给猫主子喂食的猫粮油脂比较大&#xff0c;不禁让人担心这对猫咪是否真的好。 1️⃣ 首先&#xff0c;让我们来聊聊油脂在猫粮…

Spring Boot + Vue 全栈开发,都需要哪些前端知识?

Node.js默认安装的npm包和工具的位置&#xff1a;Node.js目录\node_modules 在这个目录下你可以看见 npm目录&#xff0c;npm本身就是被NPM包管理器管理的一个工具&#xff0c;说明 Node.js已经集成了npm工具 #在命令提示符输入 npm -v 可查看当前npm版本 npm -v 二、使用n…

代理IP超时是什么原因?

很多用户在使用代理IP进行网络访问时&#xff0c;可能会遇到代理IP超时的情况&#xff0c;也就是代理IP的延迟过高。代理IP延迟过高会影响用户的网络体验和数据获取效率。因此&#xff0c;了解代理IP延迟过高的原因很重要。以下是导致代理IP延迟过高的一些常见原因&#xff1a;…

FL Studio 21.2.3官方中文版重磅发布,手把手教你图文安装

FL Studio 21.2.3官方中文版重磅发布纯正简体中文支持&#xff0c;更快捷的音频剪辑及素材管理器&#xff0c;多样主题随心换&#xff01; 在数字音乐制作领域&#xff0c;FL Studio一直以其强大的功能和用户友好的界面而备受赞誉。随着技术的不断进步和音乐制作需求的日益增长…

Python高压电容导电体和水文椭圆微分

&#x1f3af;要点 &#x1f3af;二维热传导二阶偏微分方程 | &#x1f3af;调和函数和几何图曲率 | &#x1f3af;解潮汐波动方程 | &#x1f3af;解静止基态旋转球体流体运动函数 | &#x1f3af;水文空间插值 | &#x1f3af;流体流动模拟求解器 | &#x1f3af;随机算法解…

泰迪智能科技与成都文理学院人工智能与大数据学院开展校企合作交流

近日&#xff0c;在推动高等教育与产业深度融合的背景下&#xff0c;成都文理学院人工智能与大数据学院携手广东泰迪智能科技股份有限公司开展“专业建设交流会”。人工智能与大数据学院院长胡念青、院长助理陈坚、骨干教师刘超超、孙沛、赵杰、文运、胡斌、邹杰出席本次交流会…

vue项目中dom拖动排序功能实现

vue项目中拖动元素改变其顺序的功能实现 实现此功能&#xff0c;我利用的是SortableJs,其官网上直接介绍其为功能强大的js拖拽库&#xff0c;只需要简单的代码即可实现dom拖拽 1.下载 npm i sortablejs 2.引入 使用时&#xff0c;我们在那个页面中使用&#xff0c;就在该vue文…

【progressBar-js】优雅的 前端进度条 构建!

progressBar-js JS 前端进度条小工具 您可以通过此工具来构建一个有效的工具条&#xff0c;接下来就是一个示例&#xff01; 使用示例 引入 progressBar-js 库 直接在这里将 css 和 js 文件引入进来就算是成功导入了哦&#xff01;&#xff01;&#xff01; <link href&…

文件怎么加密?电脑文件加密,分享5个实用方法

通常情况下&#xff0c;人们对手机数据的保护比对电脑数据更为重视。许多人使用指纹和密码来防止他人窥视聊天记录和照片。然而&#xff0c;电脑上的数据却常常被忽视。大多数用户仅设置了电脑登录密码&#xff0c;认为这样就足以保护电脑和其中的文件。然而如果你也是这样认为…

hex、bin、elf、s19等文件格式介绍以及格式转换

文章目录 前言一、bin文件二、hex文件数据记录格式扩展线性地址记录(HEX386)格式扩展段地址记录(HEX86)文件结束(EOF)记录三、elf文件四、S19文件五、不同格式之间转换将bin文件转换成hex文件将hex文件转换成bin文件将bin文件转换成s19文件前言 编译器或汇编器将程序的源代码(…

详解三种常用标准化 Batch Norm Layer Norm RMSNorm

参考&#xff1a; BN究竟起了什么作用&#xff1f;一个闭门造车的分析《动手学深度学习》7.5 节 深度学习中&#xff0c;归一化是常用的稳定训练的手段&#xff0c;CV 中常用 Batch Norm&#xff1b; Transformer 类模型中常用 layer norm&#xff0c;而 RMSNorm 是近期很流行…

Pyppeteer原理介绍和入门尝试

pyppeteer仓库地址&#xff1a;https://github.com/miyakogi/pyppeteer puppeteer仓库地址&#xff1a;https://github.com/search?qpuppeteer&typerepositories 因为有些网页是可以检测到是否是使用了selenium。并且selenium所谓的保护机制不允许跨域cookies保存以及登…