前端学习(2464):vue中 slot

Slot

Slot=>内容分发,占位元素

父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。Slot分发的内容,作用域是在父组件上

1.Vue2.6版本前的旧特性用法

1.1不具名slot

父组件内使用子组件

<children><p>我是第一行</p><p>我是第二行</p>
</children>

子组件模板内容

<div><p>template div 内容</p> <!-- <slot>slot标签内的内容</slot>slot外div内的内容 -->
</div>

渲染过程: 模板内容直接替换childre中的内容

<div><p>template div p 内容</p>
</div>

接上 启用slot后的渲染结果

<div><p>template div 内容</p><p>我是第一行</p><p>我是第二行</p><!--复制被调用子组件内的内容并替换<slot></slot>自身-->slot外div内的内容<!--该内容按从上到下被渲染-->      
</div>

渲染过程: 按子组件模板从上至下渲染,先将<p>template div 内容</p>渲染出来,紧接着读取到slot标签立即复制被调用子组件内的内容并替换<slot></slot>自身,然后渲染子组件模版内剩余

1.2具名slot

父组件内使用子组件

<children><p>我是第一行</p><p>我是第二行</p><slot>第一个slot</slot><slot>第二个slot</slot><h2 slot="header">头部在这</h2><p>中间在这</p><div slot="footer"><div>底部在这</div></div>
</children>

子组件模板内容

<div><slot></slot><h2 slot="header">h2 slot=header</h2><!--不报错,应该被认为常规元素,会被渲染到不具名slot区域--><slot name="header"></slot><!--在父组件中搜查匹配 带有名叫"header"slot的元素并复制替换本处元素-->  <slot name="footer"></slot><!--在父组件中搜查匹配 带有名叫"footer"slot的元素并复制替换本处元素-->  
</div>

渲染成:

<div><p>我是第一行</p><p>我是第二行</p> 第一个slot 第二个slot <p>中间在这</p><h2 slot="header">h2 slot=header</h2><h2>头部在这</h2><div><div>底部在这</div></div>
</div>

渲染过程:读取到slot标签后将被调用的子组件中没有被具名插槽包裹的内容及子组件模版内的常规内容替换slot标签所在区域并按顺序渲染,读到具名slot则在被调用的子组件中查找与之name对应的内容复制替换对应的具名插槽并渲染

1.3作用域插槽 slot-scope

2.6之前 ==>slot scope=”别名”
在父组件内使用 slot-scope 并使用传入的数据
将<span v-for="item in aaa.shuju">{{item}}</span>复制替换子组件的<slot></slot>,并将“shuju”作为receiveData的新属性(类似这个意思),此时receiveData.shuju就等同于子组件中返回的data对象

<template slot-scope="receiveData"><div><span v-for="item in receiveData.shuju">{{item}}</span></div>
</template>

在子组件内设定传入的值并在slot上绑定需要传入的值
子组件内

模板:     
<div><slot :shuju="data"></slot>
</div>

其他:

data:function(){
return{data:['zhangsan','lisi','wangwu','maliu','qianqi','zhouba']}}

最终渲染成:

<div><h3>这里是子组件</h3><div><span>zhangsan</span><span>lisi</span><span>wangwu</span><span>maliu</span><span>qianqi</span><span>zhouba</span></div>
</div>

2.Vue2.6版本及以后的新特性用法

2.1 不具名插槽

父组件内使用子组件

<children><template v-slot> <!--此处的v-slot等同于 v-slot:default--><div>template v-slot中的内容</div></template>
</children>

子组件模板内

<div><slot></slot>     
</div>

最终渲染成:

<div><div>template v-slot中的内容</div>
</div>

渲染过程基本一致

2.2 具名插槽

2.6新特性 v-slot 只能被用于组件或者模板 上方使用v-slot
父组件内使用子组件

<children><template v-slot:header>hahaha</template><template v-slot:footer>脚在这儿</template><template v-slot:header>头部在这</template><!--此处会覆盖上面同名--><p>中间在这</p><template v-slot:footer><!--此处会覆盖上面同名--><div>底部在这</div></template>
</children>

子组件模板内

<div><slot></slot><slot name="header"></slot><slot name="footer"></slot>
</div>

最终渲染成:

<div><p>中间在这</p> 头部在这 <div>底部在这</div>
</div>

渲染过程基本一致
注意:多个同名具名插后面的覆盖前面的,只会有一个起效!

2.3作用域插槽

v-slot
在父组件内使用 v-slot=”xxx” 并传入的数据

<children><template v-slot:header>hahaha</template><template v-slot:footer>脚在这儿</template><template v-slot:header>头部在这</template><!--此处会覆盖上面同名--><p>中间在这</p><template v-slot:footer="receiveData"><!--此处会覆盖上面同名--><div>底部在这</div><div>{{receiveData.sendData.firstName}}+{{receiveData.sendData.lastName}}</div></template>
</children>

子组件模板内

<div><slot></slot><slot name="header"></slot><slot name="footer" :sendData="userInfo"></slot>
</div>

最终渲染成:

<div><p>中间在这</p> 头部在这 <div>底部在这</div><div>Brain+Lu</div>
</div>

渲染过程基本一致

3.理解及结论

默认(后备)内容[一般指子组件模板内的<slot>默认(后备)内容</slot>]生效的情况:在父组件内使用的子组件内不包含可渲染内容的情况下会被渲染出来。
渲染顺序:在父组中被调用的子组件外的内容有线渲染,然后子组件模板内从上至下渲染。
Slot执行过程:子组件的模板把父组件中的内容(<children>内容</children>)选择性复制然后替换本身。
Slot-不具名插槽==>子组件模板内各个<slot></slot>都会把父组件中除具名插槽包裹的其他内容复制一份并替换自身(<slot></slot>)位置
Slot-具名插槽==>子组件模板内各个<slot name="xxx"></slot>都会把父组件中的与匹配的具名插槽包裹的其他内容复制一份并替换自身(<slot></slot>)位置再渲染
v-slot写法同时存在多个同名具名插槽,写在最后的那个起效
同时存在两种写法的情况下 新写法的渲染优先级更高,不论是否具名都会覆盖掉就写法

<template v-slot:footer>template v-slot
</template>
<p slot="footer">slot=footer</p>   <!--此处不会被渲染,不论写在v-slot之前还是之后-->

目前还未应用于实际场景,听闻Element的table组件和Button组件似乎有用到slot,暂未探究,有兴趣的小伙伴可以去看看;有实际应用也可告诉我。
注:结论等均是感性认知,不一定是正确的,只是方便理解(也许只是自己)

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

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

相关文章

Spring Boot快速入门

安装 安装依赖 maven是一个依赖管理工具&#xff0c;我们利用maven进行构建。创建一个maven项目&#xff0c;在pom.xml里面添加依赖项 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmln…

前端学习(2465):ajax发送请求

原文链接&#xff1a;https://www.cnblogs.com/0x29a/p/11231950.html 1. 创建XMLHttpRequest异步对象 步骤一代码引自&#xff1a;https://www.w3school.com.cn/ajax/ajax_xmlhttprequest_create.asp var xhr; if (window.XMLHttpRequest){// code for IE7, Firefox, Chrome, …

mysql数据库with ur_Python使用MySQL数据库(新)

一&#xff0c;安装mysql如果是windows用户&#xff0c;mysql的安装非常简单&#xff0c;直接下载安装文件&#xff0c;双击安装文件一步一步进行操作即可。Linux 下的安装可能会更加简单&#xff0c;除了下载安装包进行安装外&#xff0c;一般的linux仓库中都会有mysql&#x…

洛谷——P1067 多项式输出

https://www.luogu.org/problem/show?pid1067#sub 题目描述 一元 n 次多项式可用如下的表达式表示&#xff1a; 其中&#xff0c;aixi称为 i 次项&#xff0c;ai 称为 i 次项的系数。给出一个一元多项式各项的次数和系数&#xff0c;请按照如下规定的格式要求输出该多项式&…

前端学习(2466):在前端页面中引入百度地图

1.配置你需要的地图效果百度地图生成器 可选配置&#xff1a;位置、宽高、缩放、标注样式 2.导出导入地图代码点击获取代码&#xff0c;将代码引入到你的html、js、vue等文件中 ps:标注不显示的解决方法&#xff1a;将图标链接换成&#xff1a; var icon new BMap.Icon("…

$动态规划系列(2)——找零钱问题

refer:http://interactivepython.org/courselib/static/pythonds/index.html 1. 问题描述 Tom在自动售货机上买了一瓶饮料&#xff0c;售价37美分&#xff0c;他投入了1美元&#xff08;1美元 100美分&#xff09;&#xff0c;现在自动售货机需要找钱给他。售货机中现在只有四…

前端学习(2467):在前端页面中引入百度地图

走在前端的大道上 插槽&#xff0c;也就是slot&#xff0c;是组件的一块HTML模板&#xff0c;这块模板显示不显示、以及怎样显示由父组件来决定。 实际上&#xff0c;一个slot最核心的两个问题在这里就点出来了&#xff0c;是显示不显示和怎样显示。 由于插槽是一块模板&…

pm961 mysql_Oracle GoldenGate学习之--异构平台同步(Mysql到Oracle)

Oracle GoldenGate学习之--异构平台同步(Mysql到Oracle)如图所示&#xff1a;源端采用Mysql库&#xff0c;目标端采用Oracle库一、OGG安装配置(源端)1、OGG下载https://edelivery.oracle.com/EPD/Download/get_form?egroup_aru_number14841438https://edelivery.oracle.com/EP…

错误记录

1.Soap 1.1 endpoint already registered on address /cxfService答案&#xff1a;web.xml中多配置了 <init-param> <param-name>config-location</param-name> <param-value>classpath:cxf.xml</param-value> </init-param> 2.The serve…

sqlalchemy mysql配置中怎么设置utf8_在SqlAlchemy中,我想要一个列是UTF8?

我注意到我的MySQL数据库在默认情况下没有设置为UTF-8。改为选择latin1_swedish_ci排序规则。在所以我很自然地遇到了一个用户报告的错误&#xff0c;我的应用程序不支持特殊字符。我去确保我的应用程序正确地处理了UTF-8&#xff0c;编写了一个测试&#xff0c;很肯定它可以很…

ado.net mysql 连接池_ADO.NET数据库连接池的介绍 | 学步园

摘录自MSDN&#xff1a;建立池连接可以显著提高应用程序的性能和可缩放性。SQL Server .NET Framework 数据提供程序自动为 ADO.NET客户端应用程序提供连接池。您也可以提供几个连接字符串修饰符来控制连接池行为&#xff0c;请参见本主题内下文中“使用连接字符串关键字控制连…

转:在csv中维护变量参数

问题&#xff1a; 1、我的变量表多&#xff0c;通过之前的csv获取的方式&#xff0c;或者用户变量来维护&#xff0c;比较麻烦 2、我想在脚本之外维护我的变量数据&#xff0c;脱离脚本 解决方案&#xff1a; 1、csv的配置如图&#xff0c;队列是变量名称&#xff0c;第二列是变…

前端学习(2471):vue-echarts和echarts的区别:

vue-echarts和echarts的区别&#xff1a; vue-echarts是封装后的vue插件&#xff0c; 基于 ECharts v4.0.1 开发&#xff0c;依赖 Vue.js v2.2.6&#xff0c;功能一样的只是把它封装成vue插件 这样更方便以vue的方式去使用它。echarts就是普通的js库&#xff0c; vue-echarts特…

python 零代码快速开发平台_现在低代码开发平台和零代码平台区别是什么?

低代码与零代码&#xff0c;可参考一下开发平台在国内已经发展了很久了&#xff0c;从有代码到低代码&#xff0c;甚至有些厂家声称可以无代码&#xff0c;当然无代码只是一个噱头。低代码开发可以解决传统的开发方式的复杂方式&#xff0c;提高开发效率&#xff0c;节省时间成…

JSON.parse()、eval()和JSON.stringify()

1.什么是JSON&#xff1f; JSON全称是JavaScript Object Notation,是一种轻量级的数据交换格式。JSON 与XML具有相同的特性&#xff0c;是一种数据存储格式&#xff0c;但是JSON相比XML 更易于人编写和阅读&#xff0c;更易于生成和解析。 2.json对象和json字符串 json对象可以…