vue slot scope使用_20、slot插槽的用法

v2-bb3b8b359a36a49dfbddd85c85b7daf1_1440w.jpg?source=172ae18b

重点:

单个插槽、具名插槽、作用域插槽的用法;
访问插槽的方法。

其实本小白对插槽理解的还不深,哪些场景会经常用到插槽也不了解。

但是本着“大胆猜测”的理念,我的猜测如下:

  • 假设有 父组件A,有 子组件B、子组件C、子组件D;
  • 三个子组件要显示不同的内容,于是可以在三个子组件中各自写不同的内容;
  • 但是如果子组件中有重复的部分,那就会产生冗余的代码,而且修改起来也不方便;
  • 于是可是将这些重复的部分,放到他们的 父组件A 中,由 父组件 统一管理;
  • 哪个子组件要用到这些内容, 父组件就把内容发给谁,也就是“内容分发”;
  • 由父组件统一管理,还有一个好处就是,只需要修改父组件中的内容,子组件就会随之改变;
  • “内容分发”的过程,又仿佛与组件通信的过程类似;
  • 比如:父组件要怎么“发内容”呢?子组件要怎么“收内容”呢?
  • 于是“插槽(slot)”就登场了;
  • 只需要在子组件中使用 slot 元素,就可以将内容显示出来。

接下来,就主要介绍“单个插槽”、“具名插槽”、“作用域插槽”的用法。

一、单个插槽

首先请看:

<div id="app">                   <child-component>            <p>来自父组件的问候</p>  // 这看似是在子组件中写的内容,但其实这是属于父组件的作用域</child-component>         // 也就是说,其实这个 p元素 ,是父组件中的内容  
</div>                          Vue.component('child-component', {template: `<div></div>`
})var app = new Vue({el: '#app',data: {}
})

如果像上面这样,直接在 <child-component></child-component>中写东西,是不会被渲染的,因为子组件还没接收你写的东西。子组件里只有一个空的 div 元素,所以页面只渲染一个空的 div ,如图:

v2-7f1a482f78226d1213313930794d0d6f_b.jpg

那么子组件要如何接收父组件传来的内容呢?答案是,在子组件中使用 slot 元素就好了:

Vue.component('child-component', {template: `<div><slot></slot>  // 在子组件中使用 slot 元素</div>`
})

看,现在页面就渲染出了父组件中写的 p 元素:

v2-6105cbf8f12575ea3e1ceb5a8db4e804_b.jpg

总结:

在子组件中使用 slot 做一个插槽,父组件中的内容就可以插到这个插槽里边。


二、具名插槽

顾名思义,具名插槽,就是有名字的插槽。

如果父组件中有很多内容都要放到子组件中,如果子组件中只有一个 slot(插槽)的话,那所有内容都挤到一起,显然是不合理的。所以我们需要多个 slot(插槽),并给每个 slot(插槽)起个名字,那么就能很方便的讲指定内容放到指定 slot(插槽)中。

比如父组件中有一首诗:

<div id="app"><child-component><p>离离原上草,</p>    // 注意,这里的作用域还是父组件的作用域<p>一岁一枯荣。</p><p>野火烧不尽,</p><p>春风吹又生。</p><address>白居易</address><h2>赋得古原草送别</h2></child-component>
</div>Vue.component('child-component', {template: `<div><slot></slot>    // 子组件中只有一个 slot(插槽),那么所有内容都将按顺序被插到这个 slot 中</div>`
})var app = new Vue({el: '#app',data: {}
})

渲染:

v2-e8a90288183eff88e00c36ae45948f0d_b.jpg

显然这样是不合适的,如果有更多的内容,那么更多的内容都将被插到这一个 slot 中。

于是我们在子组件中多写几个 slot,并给他们名字:

Vue.component('child-component', {template: `<div><slot name="header"></slot>  // 有 name<slot></slot>                // 没有 name ?这个先放着,后面再说<slot name="footer"></slot>  // 有 name</div>`
})

那么相应的,也要给父组件中的内容起个名字,不然怎么知道哪个插到哪里呢??但是要注意的是,给父组件中的内容起名字,要用到 slot,而不是 name:

<div id="app"><child-component><p>离离原上草,</p><p>一岁一枯荣。</p><p>野火烧不尽,</p><p>春风吹又生。</p>                      // 上面的四个 p 元素没名字?<address slot="footer">白居易</address>  // 用 slot 起名字<h2 slot="header">赋得古原草送别</h2>  // 用 slot 起名字</child-component>
</div>

先看看页面是怎么渲染的:

v2-cc3211de4a8afc6441d891e91d6a4a6e_b.jpg

这里需要注意几点:

  • 页面渲染的顺序,是子组件中 slot 的顺序;
  • 子组件中有名字的 slot,显示父组件中有对应名字的内容;没有名字的 slot,显示父组件中没有名字的内容;

三、作用域插槽

上面说的单个插槽和具名插槽,都是父组件向子组件传递数据。那么,父组件要从子组件中获取数据,怎么办呢?同样,使用 slot 就可以办到。

<div id="app"><child-component><template slot="text1" slot-scope="data">  // 这里用的 template{{ data.text }}</template><p slot="text2" slot-scope="data">  // 这里用的 p{{ data.text }}</p></child-component>
</div>Vue.component('child-component', {template: `<div><slot name="text1" text="我多想再见你,哪怕匆匆一眼就别离"></slot><slot name="text2" text="路灯下昏黄的剪影,越走越漫长的林径"></slot></div>`
})var app = new Vue({el: '#app',data: {}
})

以上代码中,子组件中使用了两个 slot 并且都有 name 属性,对应了父组件中的 template 元素 和 p 元素。

为什么要用两个不同的元素呢?原因是,在 Vue 2.5.0 版本之前,要想使用作用域插槽获取子组件数据,必须使用 template 元素;而在 Vue 2.5.0 版本之后,就可以使用其他元素了。所以上面代码中,使用了 p 元素做了一个测试,你也可以尝试其他元素。

接着看上面代码,子组件中的 text,就是子组件中的数据。看看父组件是怎么获取的?它分别在 template 和 p 上写了 slot-scope 属性,scope 有“范围”的意思,也就是 slot 的范围,也就是“作用域插槽”了。同时我们还看到:

slot-scope="data"

data 其实就是一个变量名,你也可以换成其他的名字,比如 prop,如果换成 prop,你就要这么写:

<template slot="text1" slot-scope="prop">  {{ prop.text }}
</template>

四、访问插槽

还记得上篇文章的子链吗?父链 和 子链

如果有多个子链,我们访问子链的时候,就要用到 this.$refs。

同样的,如果有多个插槽,我们访问插槽的时候,就要用到 this.$slots。

<div id="app"><child-component><p>离离原上草</p><p>一岁一枯荣</p><p>野火烧不尽</p><p>春风吹又生</p><address slot="footer">白居易</address><h2 slot="header">赋得古原草送别</h2></child-component>
</div>Vue.component('child-component', {template: `<div><slot name="header"></slot><slot name="footer"></slot><slot></slot></div>`,mounted: function () {let header = this.$slots.header  // 访问名字为 header 的插槽let footer = this.$slots.footer  // 访问名字为 footer 的插槽let headerText = header[0].elm.innerText  // header 中的元素的文本let footerText = footer[0].elm.innerText  // footer 中的元素的文本console.log(headerText)console.log(footerText)}
})var app = new Vue({el: '#app',data: {}
})

控制台打印:

v2-b4e0f578d781e6de5aac48114a69003e_b.jpg

如果你觉得插槽不好理解的话,你就想象小时候玩的“小霸王”。是不是得插个卡到那个卡槽里,才能开始玩游戏?那个卡槽,就相当于子组件中的 slot,游戏卡就相当于父组件中的内容。你得把内容插到 slot 里,子组件才能正确被渲染。

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

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

相关文章

python工作目录_如何使用python 3获取当前工作目录?

When I run the following script in IDLE import os print(os.getcwd()) I get output as D:\testtool but when I run from cmd prompt, I get c:\Python33>python D:\testtool\current_dir.py c:\Python33 How do I get same result which I got using IDLE ? 解决方案 …

flutter刷新页面_用Flutter实现58App的首页

背景Flutter作为全新跨平台应用框架&#xff0c;在页面渲染和MD开发上优势明显&#xff0c;可谓是业界一枝独秀。正好最近有这样的一个机会学习Flutter开发&#xff0c;我们便尝试用它开发一个MD风格的较复杂页面&#xff0c;来比较跟原生应用开发的优势。也是想通过对新框架的…

python调用报表制作工具_使用Python轻松制作漂亮的表格

Python太有用而且很方便 图表可以用matplotlib轻松制作&#xff0c;数值计算只要有numpy就行。 最近&#xff0c;Python被广泛用于机器学习系统的研究&#xff0c;甚至还能制作游戏。 我突然想知道&#xff1a;“是否可以用Python来制作图表而不是表格&#xff1f;” 这个时候&…

小米网关控制空调伴侣_小爱同学怎么控制灯?

说说我们神奇小爱同学吧&#xff0c;小爱同学是小米旗下的一款智能AI音箱&#xff0c;会根据您的指令来操作电器设备&#xff0c;比如说开关灯&#xff0c;那么小爱同学怎么控制灯&#xff1f;如果家里的是传统的灯泡&#xff0c;不是智能灯连接还能控制吗&#xff1f;今天蜜罐…

bochs上网镜像怎么上网_【干货科普】上网慢!经常掉线!怎么办?

文章来源&#xff1a;鲜枣课堂(ID&#xff1a;xzclasscom)作为也算是懂点技术的半专业人士&#xff0c;我们放假回去&#xff0c;遇到亲友&#xff0c;很可能被问到这样的问题——“我的手机(电脑)上网经常掉线&#xff0c;是为什么&#xff1f;”“我的手机(电脑)上网总是很慢…

sql 中位数_【PL/SQL 自定义函数】 常用场景

看完这章后你会学习到以下内容&#xff1a;1.练习场景2.面试场景3.工作应用场景总览思维导图&#xff1a;面试部分&#xff1a;1.创建函数,从emp表中查询指定员工编号的职工的工资CREATE OR REPLACE FUNCTION CHECK_SAL(F_EMPNO IN EMP.EMPNO%TYPE) RETURN NUMBER ISV_SAL VARC…

swift date 计算差_[Swift 设计模式] 适配器

更多内容&#xff0c;欢迎关注公众号&#xff1a;Swift花园喜欢文章&#xff1f;不如来个 ➕三连&#xff1f;关注专栏&#xff0c;关注我 将一个不兼容的对象转换成目标接口或者类&#xff0c;这是适配器模式的作用。下面这件东西是适配器模式在现实世界中最贴切的表达。 USB-…

委外订单_听听晚报-英特尔扩大芯片委外订单、苹果秋季或举行两场发布会

英特尔扩大芯片委外订单据外媒报道称&#xff0c;美国半导体厂商英特尔已与中国台湾芯片制造厂商台积电达成协议&#xff0c;明年开始采用后者7nm的优化版本6nm制程量产处理器或显卡&#xff0c;预估投片量将达到18万片。该消息发出后&#xff0c;资本市场反应剧烈&#xff0c;…

打开另外一个页面_如何在PDF页面中插入图片?

如何给PDF添加图片&#xff1f;有些时候为了丰富PDF的文档内容&#xff0c;需要添加一些图片&#xff0c;相比Word或PPT文档可以直接插入图片&#xff0c;而PDF的操作很多人可能并不熟悉&#xff0c;下面一起来看看如何在PDF文档中插入图片。关于PDF文档插入图片分为两种情况&a…

spring boot mybatis 整合_MyBatis学习:MyBatis和Spring整合

1. 整合的工程结构首先我们来看下整合之后的工程结构是什么样的。2. 配置文件在于spring整合之前&#xff0c;mybatis都是自己管理数据源的&#xff0c;然后sqlSessionFactory是我们自己去注入的&#xff0c;现在整合了&#xff0c;这些都要交给spring来管理了&#xff0c;来看…

python中缩进_python编程中的缩进是什么意思

Python最具特色的是用缩进来标明成块的代码。我下面以if选择结构来举例。if后面跟随条件&#xff0c;如果条件成立&#xff0c;则执行归属于if的一个代码块。 下面对比C语言来看一下if ( i > 0 ) { x 1; y 2; } 如果i > 0的话&#xff0c;我们将进行括号中所包括的两个…

返回后的数据处理_【掘金使用技巧2】掘金返回数据中时间的处理方法

掘金输出的时间数据处理方法掘金在为使用者提供数据时&#xff0c;有一类数据处理起来有些麻烦&#xff0c;这类数据就是时间数据。它们长这样&#xff1a;或者这样&#xff1a;查看一下它们的类型&#xff0c;发现有datetime,datetime64,Timestamp等等。这么多各种各样的类型&…

springboot jwt token前后端分离_为什么要 前后端分离 ?

作 者&#xff1a;互扯程序来 源&#xff1a;互扯程序广而告之&#xff1a;由于此订阅号换了个皮肤&#xff0c;系统自动取消了读者的公众号置顶。导致用户接受文章不及时。您可以打开订阅号&#xff0c;选择置顶(星标)公众号&#xff0c;重磅干货&#xff0c;第一时间送达&…

分计算iv值_一文读懂评分卡的IV、KS、AUC、GINI指标

前言&#xff1a;当一张评分卡构建完成时&#xff0c;筛选出一组特征生成了分数&#xff0c;我们会想要知道这个分数是否靠谱&#xff0c;即是否可以依赖这个分数将好坏客户区分开来&#xff0c;这个时候就需要评判评分卡有效性的指标。测量评分卡好坏区分能力的指标有许多&…

linux 查找文件夹_用python打造一个基于socket的文件(夹)传输系统

这段时间在学习python&#xff0c;接触到了网络编程中的socket这块&#xff0c;加上自己在用的Linux服务器都是原生支持python的&#xff0c;于是乎有了个做文件传输功能程序的想法。毕竟python语言中&#xff0c;有下载功能的框架一抓一大把&#xff0c;但是主机与主机间快速搭…

mysql gtid 备份恢复_MySQL基于gtid特性与xtrabackup的数据恢复

一、gtid特性介绍&#xff1a;GTID(global transaction identifier)是MySQL 5.6的新特性&#xff0c;可以唯一的标识一个事务&#xff0c;由UUIDTID组成&#xff1a;UUID是MySQL实例的唯一标识TID是该实例上已提交的事务的数量在主从复制中&#xff0c;GTID代替了classic的复制…

编码gbk的不可映射字符_Python基础:编码表和字符的故事

在计算机内部&#xff0c;都是每8位组成的一个个字节&#xff0c;比如我们使用"abc".encode()把abc转化成二进制byte类型&#xff0c;注意byte是不可变类型&#xff1a; 编码过程>>> abc.encode() # 把str字符变为bytes字节类型&#xff1b;字符是一个个连接…

mysql 中文字段名_MySQL全文索引怎么做?| 教程分享

- 点击上方“爱数据学习社”关注我们吧&#xff01; -文末领取【商业分析资料】为什么要用全文索引我们在用一个东西前&#xff0c;得知道为什么要用它&#xff0c;使用全文索引无非有以下原因&#xff1a;like查询太慢、json字段查询太慢(车太慢了)没时间引入ElasticSearch、S…

leftjoin多个on条件_MYSQL|为什么LEFT JOIN会这么慢?

之前谈了怎样后台导出SAP序时账&#xff0c;因为导出的序时账数据量较大(3家主体公司&#xff0c;2017-2020年的数据)&#xff0c;用了数据库MYSQL中的LEFT JOIN 来处理连接多表汇总数据&#xff0c;查询太慢啦&#xff0c;后来沦落到用手工分年来汇总数据&#xff0c;然后再导…

python 画布包括不了全部组件?_试验程序:画布版九键琴

近期有读者询问如何制作出滑动琴键连续发出声音的程序&#xff0c;他尝试用一排按钮充当琴键&#xff0c;但每次滑动只能触发一个按钮的点击事件&#xff0c;因此也只能发出一个声音。我提示他用画布替代按钮&#xff0c;他希望给予更具体的提示&#xff0c;于是我索性自己做了…