vue设置标签自定义属性_Vue组件化开发之插槽

    插槽为组件提供了强大的扩展能力。我们可以把电脑的主板理解为一个已经封装好的组件,主板上都会预留各种插槽,我们可以往插槽中插入内存条、显卡、声卡等设备。基于同样的思想,Vue在封装组件时,也可以预留插槽,在组件被使用的时候,我们就可以往组件插槽中插上其他内容。

    Vue中的插槽用 slot 标签进行占位。这一块我们会讲两部分内容:插槽作用域插槽

    插槽可理解为,父模板中向子组件内部传递内容。作用域插槽则是,父模板中获取子组件中的数据,组装好内容之后再传递给子组件。下面我们分别详细介绍。

一、插槽

前面说了,插槽是使用 slot 标签在组件中放置占位符。我们定义一个带插槽的组件。

Vue.component('alert-box', {  template: `    
      Error!
`})

组件模板 template 中的  就是我们为 alert-box 组件预留的插槽。alert-box 组件在使用的时候,我们就能往插槽中传递内容。

比如我们传递一段文本

  Something bad happened.

就会被渲染如下

207bf77de09c8000565701b46bbb2a98.png

如果我们传递一个按钮

  紧急事件

按钮就会被渲染出来

d84b786a22c0c598d312bace24972b64.png

我们也可以传入一堆HTML内容,这些HTML内容都会渲染到 slot 所在的位置。

  

紧急通知

请同学们赶紧撤离

校长办公室

渲染如下

c816e952842c6a4fea2185e439057040.png

通过上面这个例子,应该大致明白了插槽的作用。

    为了方便使用,Vue提供了给插槽设置默认内容的功能。如果外部不传入内容,则展示默认内容。如果外部传入内容,则展示传入的内容。

Vue.component('alert-box', {  template: `    
Error! Something bad happened.
`})

默认内容是放在  中间,上面我们就是在  中间放置了一段文本 Something bad happened. 。在使用的时候,如果不传入内容,默认就显示这段文本。

紧急撤离

就会被渲染成

ccb4ca3ce5ab47f48fdc6fd75a73ef8b.png

    上面我们没有给插槽指定名字,实际上Vue会给没有起名字的插槽自动加上一个 default 的名字,等同于

    我们也可以为插槽指定其它名字,以方便外部在传入内容的时候,可以指定将内容传递给哪个插槽。这样就更接近电脑主板的思想了,主板上的插槽是分内存条插槽、显卡插槽、声卡插槽 等等,每一个插槽都是有名字的。

    我们的组件插槽也可以这样,比如下面代码中我们就指定了头部插槽、尾部插槽。

Vue.component('base-layout', {    template: `            `})

    这时候在使用的时候,就需要指定内容究竟是传递给哪个插槽,未指定的都会传递给匿名插槽,也就是 default 插槽。

    

Here might be a page title

A paragraph for the main content.

And another one.

Here's some contact info

    如果组件内有多个匿名插槽,那就会传递多份。如果组件内没有匿名插槽,未指定插槽名的内容就会被丢弃。

    不过,slot 属性在Vue 2.6.0版本中已经不推荐使用,官方推荐用 v-slot 指令来替代 slot 。v-slot 指令更强大,它不仅可以在这里替代 slot ,还可以替代作用域插槽中的 slot-scope。

    我们使用 v-slot 指令改造一下上面的用法。我们通过在一个  元素上使用 v-slot 指令,并以 v-slot 的参数的形式提供其名称,来向具名插槽传递内容。

      

Here might be a page title

A paragraph for the main content.

And another one.

Here's some contact info

    这两种使用的效果是一样的。不过我们推荐使用新语法 v-slot 指令。

二、作用域插槽

    在学习作用域插槽之前,我们先要明白作用域插槽到底解决了什么问题。

    很多时候我们会有这样的需求,需要把子组件中的数据通过父级模板的控制,从而在子组件中渲染出不同的样子。这句话不太好理解,举个具体的例子。

    子组件的数据中有一数组

 letters = ['A', 'B', 'C', 'D', 'E']

我们在某处需要把这个数组渲染成:A - B - C - D - E,而在另一处又需要渲染成列表:

  • A

  • B

  • C

  • D

  • E

    这时候就可以通过作用域插槽来实现。作用域插槽就是数据由子组件提供,排版由父组件控制。

    在介绍作用域插槽之前,先要介绍一下编译作用域。因为正是编译作用域的存在,才使得作用域插槽有存在的必要。

2.1 编译作用域

    编译作用域,简单的说就是父子组件都只能取到自己实例中的数据。官方也给出了描述:父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

    我们通过一个具体的例子来说明其含义

{{msg}}  let vm = new Vue({    el: '#app',    components: {      com: {        template: `        data() {          return {            msg: '子组件'          }        }      }    },    data: {      msg: '父组件'    }  })

    父子组件中在各自的 data 中都定义了msg,并且他们值不一样。那子组件在使用的时候

{{msg}}

插值表达式 {{msg}} 到底取到的是谁的数据?很方便可以验证出 {{msg}} 取到的是父组件的数据。其实在父级模板中是无法直接取到子组件中的数据。这正是因为有编译作用域的存在。同理,在子组件中,也不能直接使用父组件中的数据。当然父子组件中的数据并不是绝对隔离,我们可以通过传值的方式,让他们数据进行交互。

作用域插槽就是要解决在父级模板中取到子组件中数据的问题。

2.2 作用域插槽

    现在目标已经明确,我们就是要在父级模板中取到子组件中的数据,所以这里势必要进行数据传递。

    先考虑子组件的数据传出,我们可以给 slot 标签设置一个自定义属性 data,然后将数据绑定到自定义属性 data 上,即可将数据传出。

然后在父级模板中接收数据。Vue是通过在 上使用特殊的 slot-scope属性,接收子组件设置在插槽 slot 上的全部自定义属性。

scope 变量就会接收到设置在 slot 上的全部自定义属性,然后我们通过点属性名的方式,就可以取到绑定在属性上面的值。

  {{scope.data}}

    现在我们来实现前面说的字符数组的渲染。在Vue实例中创建子组件com如下

  let vm = new Vue({    el: '#app',    components: {      com: {        template: `                  `,        data() {          return {            letters: ['A', 'B', 'C', 'D', 'E']          }        }      }    },  })

可以把它渲染成列表

            {{item}}      

也可以渲染成短横线连接的形式

      {{scope.data.join(' - ')}}  

我们就可以看到相同的数据展示成不同的形式。

    现在我们再完善一下作用域插槽的定义:子组件向父组件传递数据,但父组件通过传递插槽内容来控制数据在子组件中展现方式

    前面说了,slot-scope在 Vue 2.6.0中不再推荐使用,应该使用 v-slot 指令来替代,上面渲染的代码就可以改造如下

            {{item}}            {{scope.data.join(' - ')}}  

总结

    本章我们主要介绍了插槽和作用域插槽。插槽部分讲了插槽的使用、插槽默认值、具名插槽。作用域插槽部分主要讲了编译作用域和作用域插槽的使用。

    这一块内容是Vue中的高级部分,运用恰当,威力极大。

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

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

相关文章

sku设计mysql_基于spring boot拥有完整sku和下单流程的完全商城

一个基于spring boot、spring oauth2.0、mybatis、redis的轻量级、前后端分离、防范xss攻击、拥有分布式锁,为生产环境多实例完全准备,数据库为b2b2c设计,拥有完整sku和下单流程的完全开源商城前言Mall4j项目致力于为中小企业打造一个完整、易…

数据结构铁轨问题_每天5分钟用C#学习数据结构(20)图 Part 1

【基础知识】| 作者 / Edison Zhou这是恰童鞋骚年的第216篇原创文章前面已经介绍了线性表和树两类数据结构,线性表中的元素是“一对一”的关系,树中的元素是“一对多”的关系,本章所述的图结构中的元素则是“多对多”的关系。图(Graph)是一种…

中国大学生计算机设计大赛云南,第14届中国大学生计算机设计大赛云南赛区决赛举行...

掌上春城讯6月19日,2021 年“浪潮杯”云南省大学生计算机设计大赛暨第 14 届中国大学生计算机设计大赛云南赛区决赛在云南工商学院举行。中国大学生计算机设计大赛属于全国高等学校一类竞赛,是一个国家级的以实现高等学校计算机教育培养目标为核心的创新…

jvm gc,gc算法_GC解释:算法

jvm gc,gc算法如前一篇文章中所述,HotSpot JVM中有四个可用的垃圾收集器。 它们之间有一些显着差异,但是用于完成实际工作的算法背后的实际概念非常相似。 在这篇简短的文章中,我将尝试解释三种基本算法: 打标 打标紧凑 标记复…

python 链表倒数第k个节点_链表-删除单链表中倒数第k个节点

题目实现一个函数,一个可以删除单链表中倒数第k个节点难度简单分析本题比较简单,实现方法多种多样,这里提供一种方法首先明确一点,在单链表中删除倒数第k个节点,需要找到他的前一个节点,让前一个节点指向后…

天津计算机中级职称需要什么,天津市中级职称评定条件是什么

天津市中级职称评定条件是什么作者:职称驿站浏览量:5351104时间:2019-04-15转眼间2019年马上就要过完三分之一了,对于2019年的职称评审有很多人早早就开始了相关的准备工作,也有一些人才刚刚想到评审的事情&#xff0c…

jsf el表达式_JSP,JSF和EL简介

jsf el表达式JavaServer页面,JavaServer Faces和表达语言 在本文中,我将研究JavaServer Pages(JSP)和Expression Language(EL),然后将其与JavaServer Faces (JSF)关联。 …

浅谈防火墙对 FTP 的影响及故障排除

FTP 是常见的基于TCP的网络服务,它使用了两个TCP连接来建立逻辑通信信道,即控制连接和数据连接。当客户端与服务器建立一个FTP会话时,使用TCP创建一个持久的控制连接以传递命令和应答。当发送文件和其它数据传输时,它们在独立的TC…

定向输出命令_数据流的世界,带你了解Linux重定向

今天,小编就带大家一起来看看数据重定向。重定向:将原本输出到标准输出的数据重定向到一个文件中。用于终端显示输出的特殊设备:IO重定向是为了改变默认输入、输出的位置:输出重定向(标准输出STDOUT和标准错误输出STDERR)【>】…

SSH(Secure Shell) 介绍一

文章目录基本原理首次建立连接的时候的公钥交换通过ssh来进行密码登录利用公钥来登录基本原理 SSH(Secure Shell)是一套协议标准,可以用来实现两台机器之间的安全登录以及安全的数据传送,其保证数据安全的原理是非对称加密。 传…

gc 堆外_GC解释:堆

gc 堆外世代垃圾收集器 JVM堆分为两个不同的世代。 一种称为“年轻”,第二种称为“老”(有时称为终身制)。 年轻一代又分为两个主要的逻辑部分:伊甸园和幸存者空间。 垃圾收集人员还使用了虚拟空间供年轻人和老年人使用&#xff0…

数据传输协议汇总

文章目录一、FTP(File Transfer Protocol 文件传输协议)(一)FTP 通讯端口(二)FTP 支持两种连接模式(三)缺点(四)FTP 命令(五)FTP 响应码(六&#…

得力科学计算机怎么求余,山商“郭叔”:妙招讲高数 考研路上得力导师

山东工商学院数学与信息科学学院教授郭林大众网海报新闻记者 屈晨晨 烟台报道“郭老师人特别和蔼,能够和学生们打成一片,不仅讲课风趣,同时也给予了我们很多帮助,私底下我们都喊他郭叔。”这是山东工商学院很多毕业生对郭老师的评…

如何打开笔记本电脑的摄像头_Win8系统笔记本电脑摄像头无法使用的解决办法...

Win8系统电脑摄像头不能用怎么办?使用Win8系统笔记本电脑的用户反映,电脑摄像头无法使用了,这是怎么回事呢?如何解决这个问题?请看下文。解决方法:1、打开计算机中的“控制面板”,如图所示&…

浅析文件传输协议 (ftp) 的工作原理

起初,FTP并不是应用于IP网络上的协议,而是ARPANEt网络中计算机间的文件传输协议, ARPANET是美国国防部组建的老网络,于1960-1980年使用。在那时, FTP的主要功能是在主机间高速可靠地传输文件。目前FTP仍然保持其可靠性…

vb.net 同时给多个属性赋值_Python尚学堂高淇|1721时间表示unix时间点毫秒微秒time模块浮点数自动转换强制转换增强赋值运算符...

017浮点数-自动转换-强制转换-增强赋值运算符浮点数称为float用a*b^10形式表示的科学计数法,比如:3.14,314E-2或者314e-2这些数字在内存当中也是按照科学计数法存储、>>>float(3)3>>>314E-23.14>>>float(“3.14”)3.14>>>int(3…

计算机键盘复制键是哪个,键盘按什么键复制粘贴_键盘上复制粘贴快捷键是哪个键-win7之家...

使用电脑的时候经常会需要使用到复制粘贴功能,许多用户可能会习惯使用右键来复制粘贴,其实这样有点麻烦,比较简单的就是使用快捷键来操作,但是有部分用户还不知道键盘按什么键复制粘贴,如果你也有一样需求的话&#xf…

我的世界java无法安装包_手把手教你搭建java环境

前文由于一些历史原因,开发java程序需要技术人员自行搭建环境,而搭建环境对于新手来说并不友好,不像其他语言那般方便,现如今,为帮助想入门java却无法顺利搭建的同学,编写该教程,如果觉得本文有用,请添加关注,更多java教程,后续更新~第一步 下载JDK可自行前往Oracle官网下载指定…

vs 2019 社区版许可证过期_Switch版《最终幻想12:黄道时代》对比PS4版 就没差

2017年7月发布的“最终幻想12”重制版《最终幻想12:黄道时代》登陆PS4平台,4月30日这款经典游戏还将登陆Xbox One和Switch平台,都将支持60帧运行。那么游戏在Switch这款掌机上的表现到底如何呢?油管频道Direct-Feed Games就为大家…

局域网限速软件_8款Windows实用软件推荐,纯干货,总有一款是你必备的

开学后,有些小伙伴得走进大学校门,有些小伙伴走向公司大门,不管你做出了哪种选择,最终都会走向社会,走向岗位。我已经毕业走向社会近10年了,珍藏了一些小视频,呃说错了,是珍藏了一些…