Vue 中 slot 是什么?作用?分类?如何实现?

news2024/11/19 1:53:10

结论先行:

slot 插槽,是子组件提供给父组件使用的一个占位符,父组件可以在这个占位符中填充任何模板代码。主要作用就是更好的拓展和定制化组件,例如弹窗组件、表格组件等。分为默认插槽、具名插槽和作用域插槽。

其中前两个都是渲染在父级,本质上就是替换,父组件渲染完毕之后替换对应的 slot;区别在于具名插槽就是给插槽取了名字;

而作用域插槽在组件内部渲染。本质上会把父组件的内容渲染成函数,子组件调用函数,并且将数据传递给它。当需要将子组件的数据交给父组件展示,此时就可以使用作用域插槽。给数据一个新的作用域,因此叫做作用域插槽。 

应用场景:自定义的表格组件,允许用户传入自定义的结构 + 数据(从插槽中回传的)

1、什么是 slot ? 

① 官方文档 

官方文档 Vue2:插槽 — Vue.js

官方文档 Vue3:插槽 Slots | Vue.js 

② 概念 

slot(插槽)是一种用于分发内容的机制,一种用于在组件中传递内容的机制

也就是说在组件模板中利用 slot 进行占位,然后在使用组件时,传入的组件内容也就是 HTML 片段,会分发的对应的 slot 中。 

它允许你在组件的模板中定义带有特殊标记的区域,然后在使用该组件时填充这些区域。

通过 <slot></slot> 标签来定义一个插槽。这个插槽可以有默认内容,也可以是没有任何内容的。当使用该组件时,可以将内容插入到插槽中。

插槽可以有默认值,直接在 slot 里设置。

简单理解就是子组件中留下个“坑”,父组件可以使用指定内容来补“坑”。以下是一个简单的示例,展示了如何在 Vue 组件中使用插槽:

<!-- 父组件 -->
<template>
  <div>
    <h1>父组件</h1>
    <ChildComponent>
      <p>这是插入到子组件中的内容</p>
    </ChildComponent>
  </div>
</template>

<!-- 子组件 -->
<template>
  <div>
    <h2>子组件</h2>
    <!-- 这里是插槽 -->
    <slot></slot>
  </div>
</template>

在上面的示例中,父组件中的 <ChildComponent> 标签包含了一个 <p> 标签,作为插入到子组件中的内容。子组件中的 <slot></slot> 标签表示一个插槽,它将会被父组件中的内容所填充。

③ 内容定义方式 

在 Vue2.6.0 之后,使用 v-slot 或者语法糖 #插槽名 定义;在这之前使用 slot="插槽名" 定义。 

跟 v-on 和 v-bind 一样,v-slot 也有缩写,也就是把参数之前的所有内容 (v-slot:) 替换为字符 #

下面是三种 默认插槽 的内容定义方式,并且最后一个默认插槽的内容会覆盖掉上一个插槽内容 

使用 template 包裹内容,同时使用 v-slot 绑定一个名称。  

v-slot 一般跟 template 标签使用 (template 是 html5 新出的标签内容模板元素,不会渲染到页面上, 一般被 vue 解析为内部标签)

<child>
  <template>
    <span style="color: red">这里是默认插槽内容1,字体为红色</span>
  </template>

  <template v-slot:default>
    <span style="color: yellow">这里是默认插槽内容2,字体为h黄色</span>
  </template>

  <template #default>
    <span style="color: blue">这里是默认插槽内容3,字体为蓝色</span>
  </template>
</child>
④ 独占默认插槽的缩写  

v-slot:default="slotProps" 可以简写为 v-slot="slotProps"

如果我们的插槽只有默认插槽时,组件的标签可以被当做插槽的模板来使用。

也就是可以将 v-slot 直接用在组件上

2、插槽的作用 ? 

通过使用插槽,我们可以实现更加灵活和可复用的组件,增强组件的可复用性。

当一个组件需要接收外部传入的内容时,可以使用插槽来实现这个功能。

同时,插槽还可以指定默认内容,当没有提供具体内容时将显示默认内容。 

通过插槽可以让用户更好的对组件进行拓展和定制化,可以通过具名插槽指定渲染的位置。

常用的组件例如:弹窗组件、布局组件、表格组件……

3、插槽的分类 

① 默认插槽

不指定插槽 name 属性。也就是插槽的内容出口(不写名字出口会带有隐含的名字“default”)

  • 默认插槽是指在父组件中没有提供具名插槽名称的情况下使用的插槽。父组件中未匹配到具名插槽的内容会被放置在默认插槽中。
  • 在 Vue 2 中,默认插槽是不带任何属性的 <slot> 元素。
  • 在 Vue 3 中,默认插槽使用 v-slot 指令来定义。

<slot name="default"></slot>   或者  <slot></slot>

<!-- 父组件 -->
<template>
  <div>
    <h1>父组件</h1>
    <ChildComponent>
      <p>这是插入到子组件中的内容</p>
    </ChildComponent>
  </div>
</template>

<!-- 子组件 -->
<template>
  <div>
    <h2>子组件</h2>
    <!-- 这里是插槽 -->
    <slot></slot>
  </div>
</template>
② 具名插槽

渲染在父级(父组件渲染好了,子组件根据 slot 对应的名字来替换就可以);

本质上就是替换,普通插槽就是在父组件渲染完毕之后,使用子组件替换掉父组件的占位符 slot;

定义: <slot name="xxx">

使用:

  • <template #xxx></template>;
  • <template v-slot:xxx></template>
  • 具名插槽允许子组件将内容分发到父组件中指定名称的插槽上。
  • 在 Vue 2 中,可以通过给 <slot> 元素添加 name 属性来创建具名插槽,然后在父组件中使用 <template v-slot:slotName> 或者 <slot name="slotName"> 来引用具名插槽。
  • 在 Vue 3 中,具名插槽被称为命名插槽,可以使用新的 v-slot 指令来定义。
<!-- 子组件 -->
<div>
    <!-- 具名插槽:指定了name属性, 内容出口 -->
    <slot name="name-1"></slot>
</div>


<!-- 父组件 -->
<child>
<template v-slot:name-1="slotProps">
    <span style="color: red">
        {{ slotProps.user.firstName }}
        这里是具名插槽内容1,字体为红色
    </span>
</template>

<template #name-1="{ user }">
    <span style="color: yellow">
        {{ user.firstName }}
        这里是具名插槽内容2,字体为黄色
    </span>
</template>
</child>

下面是两种 具名插槽 的内容定义方式,并且最后一个插槽的内容会覆盖掉上一个插槽内容。

注意:默认插槽的缩写语法不能和具名插槽混用,因为它会导致作用域不明确

③ 作用域插槽

作用域插槽:把组件内的值取出来自定义显示内容。 

作用域插槽在组件内部渲染。本质上会把父组件的内容渲染成函数,子组件调用函数,并且将数据传递给它。函数的返回值就会替换掉这个占位符。

  • 作用域插槽允许子组件将数据传递到父组件中的插槽内容中,使得父组件可以使用子组件中的数据进行渲染。
  • 在 Vue2 中,作用域插槽通过 <slot> 元素的 name 属性以及 <template slot-scope="props"> 来实现。
  • 在 Vue 3 中,作用域插槽的语法发生了变化,使用 v-slot 指令和新的 # 符号来指定插槽的作用域

组件内变量绑定在 slot 上,然后使用组件 v-slot:插槽名字="变量" ,变量上就会绑定 slot 传递的属性和值,插槽可以自定义显示内容;

运用场景:自定义的表格组件,允许用户传入:自定义的结构 + 数据(从插槽中回传的)

scope:是我指定的作用域这个作用域是插槽的作用域。可以获取插槽上除 name 属性外的其他自定义属性,来获取到插槽上的数据

在某些场景下插槽的内容可能想要同时使用父组件域内和子组件域内的数据。要做到这一点,我们需要一种方法来让子组件在渲染时将一部分数据提供给插槽

<!-- 子组件 -->
<div>
    <slot name="name-1" slotMessage="信息1" slotMessage2="信息2"></slot>
</div>

<!-- 父组件 -->
<child>
    <template #name-1="scope">
        <!-- 下面这些值将会展示到插槽出口位置 -->
        <span>{{ scope }}</span><br>
        <span>{{ scope.slotMessage1 }}</span><br>
        <span>{{ scope.slotMessage2 }}</span><br>
    </template>
</child>

当需要将子组件的数据交给父组件展示,此时就可以使用作用域插槽。在子组件中,在 slot 中使用v-bind 绑定需要传递的数据 

<slot :testProps="list">插槽后备内容</slot> 

//在父组件中的子组件名中使用v-slot="属性名"的方式接受 
<Child> 
    <template v-slot="testProps"> 
        <p v-for="item in testProps" :key="item.id"> {{ item.name }} </p> 
    </template>
</Child>

4、动态插槽名 

 目前我们使用的插槽名称都是固定的,比如 v-slot:left、v-slot:center 等等;

我们可以通过 v-slot:[dynamicSlotName] 方式动态绑定一个名称;

4、Vue2 和 Vue3 的区别

① 都能使用 v-slot:name 或者其缩写 #name 的方式来定义具名插槽;

② 如果在父组件中传入多个插槽内容,那 Vue2 总是会展示最后一个插槽的内容,Vue3 会展示第一个插槽内容。

③ 作用域插槽,Vue2.x 的机制导致作用域插槽变了,父组件会重新渲染。而 Vue3.0 把作用域插槽改成了函数的方式,这样只会影响子组件的重新渲染,提升了渲染的性能

5、总结

① v-slot 属性只能在 <template> 上使用,但在只有默认插槽时可以在组件标签上使用;

② 默认插槽名为 default,可以省略 default 直接写v-slot;

③ 缩写为 时不能不写参数,写成 #default

④ 可以通过解构获取 v-slot={user},还可以重命名 v-slot="{user: newName}" 和定义默认值 v-slot="{user = '默认值'}"

在Vue中有渲染作用域的概念:

  • 父级模板里的所有内容都是在父级作用域中编译的
  • 子模板里的所有内容都是在子作用域中编译的

  • 组件 ChildCpn 中,可以拿到自己作用域中的 title 内容;
  • 但是在 App 中,是访问不了 ChildCpn 中的内容的,因为它们是跨作用域的访问;

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

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

相关文章

SecureCRT 9.2.4最新

SecureCRT是一款功能强大的终端仿真软件&#xff0c;它通过提供安全的、高效的会话&#xff0c;帮助用户在远程设备上完成各种任务。SecureCRT具有出色的性能和可靠性&#xff0c;能够处理复杂的网络环境&#xff0c;提供高效的远程访问和管理。 SecureCRT的主要特点包括&…

【跨境电商独立站新手入门手册】

一直想要更新一个独立站的系列合集&#xff0c;用小白也看得懂的方式阐述怎么从0到1搭建并运营一个独立站&#xff0c;并且后续我也会录制成视频。 今天&#xff0c;它来了。 这是《跨境电商独立站新手入门手册》系列的第一篇。 你是否有过这样的经历&#xff1a;当你在网上浏…

实用篇-ES-RestClient操作文档

一、RestClient案例准备 对es概念不熟悉的话&#xff0c;先去看上面的 实用篇-ES-索引库和文档&#xff0c;不建议基础不牢就直接往下学 ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求来发送给ES。 官…

zabbix的服务器端 server端安装部署

zabbix的服务器端 server 主机iplocalhost&#xff08;centos 7&#xff09;192.168.10.128 zabbix官网部署教程 但是不全&#xff0c;建议搭配这篇文章一起看 zabbixAgent部署 安装mysql 所有配置信息和Zabbix收集到的数据都被存储在数据库中。 下载对应的yum源 yum ins…

openGauss Summit 2023 | Call for Sponsor、Speaker、Demo

数据库作为千行万业数据的基石&#xff0c;也是推动数字经济发展的核心。随着数字经济的蓬勃发展&#xff0c;数据库将迎来更加广阔的应用场景和更加迫切的需求。openGauss 社区旨在汇聚产、学、研、用多方力量&#xff0c;聚焦基础软件核心能力的构建&#xff0c;引领国内数据…

煮蛋器产业研究:全球市场将超过10亿美元

近年来&#xff0c;随着科技的迅猛发展&#xff0c;煮蛋器市场逐渐呈现出多元化和智能化趋势。厂商们不断推出新款煮蛋器&#xff0c;配备更多功能以满足消费者的个性化需求。同时&#xff0c;煮蛋器也受益于烹饪技术的创新&#xff0c;如加热控制和计时功能等的引入&#xff0…

44. Adb调试QT开发的Android程序实用小技巧汇总

1. 说明 使用QT开发Android应用时,如果程序本身出现了问题,很难进行调试。不像在linux或者windows系统中,可以利用QtCreator软件本身进行一些调试,安卓应用一旦在系统中安装后,如果运行中途出现什么BUG,定位问题所在很麻烦。不过,好在有adb这种调试工具可以代替QtCreat…

笔记无法正常展示,小红书笔记收录分析!

很多时候&#xff0c;小红书收录意味着你的流量其实是被记录了&#xff0c;这是有利于你的笔记曝光的一个表现&#xff0c;今天就来带大家一起分享下&#xff0c;为什么笔记无法正常展示&#xff0c;小红书笔记收录分析&#xff01; 一、什么叫小红书笔记收录 不可能所有的笔记…

希尔顿集团旗下酒店为宾客带来冬日活力新玩法

中国上海&#xff0c;2023年11月14日 - 据希尔顿集团发布的《2024年趋势报告》显示&#xff0c;新一代亚洲旅行者正在崛起&#xff0c;也更重视高品质、个性化的服务。希尔顿集团紧随市场脉搏&#xff0c;在即将到来的冬季为宾客精心策划了一系列特色体验&#xff0c;凭借其遍布…

Visual Studio 2019 C# 断点调试代码内存窗口显示无法计算表达式的解决问题

查看如下界面&#xff0c;发现右下角内存1窗口显示无法计算表达式&#xff1a; 按照如下步骤操作即可&#xff1a; 如果s1局部变量此时有值&#xff0c;但是内存窗口还是无法计算表达式我们可以

微同城生活圈小程序源码系统 专业搭建本地生活服务的平台 带完整搭建教程

在互联网的影响下&#xff0c;越来越多的用户开始依赖手机进行日常生活。为了满足本地居民的需求&#xff0c;源码小编来给大家分享一款全新的微同城生活圈小程序源码系统。该系统旨在为本地居民提供一站式的生活服务解决方案&#xff0c;让您的生活更加便捷、高效。 以下是部…

使用 Cloudflare Worker 免费搭建网址导航网站

开源项目 GitHub&#xff1a;https://github.com/sleepwood/CF-Worker-Dir/ CloudFlare Worker&#xff1a;https://workers.cloudflare.com/ 搭建教程 首先&#xff0c;进入cloud flare - Worker 截图20200224180010.png 在 Cloudflare Worker 管理页面创建一个新的 Work…

NCP1654BD65R2G功率因数校正控制器 用于紧凑和坚固的连续导通模式预转换器

NCP1654BD65R2G是一款高效的同步整流控制器&#xff0c;主要用于DC/DC转换器和LED驱动器等应用。该控制器采用了高性能的反馈控制算法&#xff0c;可以实现高达95%以上的转换效率。此外&#xff0c;NCP1654BD65R2G还具有多种保护功能&#xff0c;如过流保护、过热保护、欠压保护…

【Linux】软硬链接和动静态库

软硬链接 软硬链接的区别&#xff1a; **软链接&#xff1a;**是一个独立文件&#xff0c;有自己独立的 inode 和 inode 编号。**硬链接&#xff1a;**不是一个独立的文件&#xff0c;它和目标文件使用的是同一个 inode。硬链接就是单纯的在 Linux 指定的目录下&#xff0c;给…

根据关键词搜索阿里巴巴商品数据列表接口|阿里巴巴商品列表数据接口|阿里巴巴商品API接口|阿里巴巴API接口

阿里巴巴也提供了根据关键词搜索商品数据列表的接口&#xff0c;方便开发者根据关键词搜索商品并进行相关操作。 请求参数可以包括&#xff1a; q&#xff1a;搜索关键字 start_price&#xff1a;开始价格 end_price&#xff1a;结束价格 page&#xff1a;页码 cat&#xff1…

Live800:2023年客服团队管理有哪些思路和方法?

在数字化时代&#xff0c;客服团队成为企业与客户之间的重要桥梁。随着技术不断发展&#xff0c;客服团队管理也在不断进化。到了2023年&#xff0c;最新的客服团队管理将会有哪些思路和方法呢&#xff1f; 一、智能化客服系统 随着人工智能技术的不断发展&#xff0c;智能化客…

超声波清洗机的工作原理是什么样的?值得入手的超声波清洗机推荐

超声波清洗机最常见的应该是在眼镜店了吧&#xff0c;眼镜店用来清洗眼镜频率非常高的&#xff01;超声波清洗机在清洁方面也是非常快速、高效的&#xff01;像眼镜党配戴眼镜脏的第一时间就会想到去眼镜店清洗&#xff0c;但也有很多朋友是随便清洗一下就了事了&#xff0c;其…

大模型的全面回顾,看透大模型 | A Comprehensive Overview of Large Language Models

大模型的全面回顾&#xff1a;A Comprehensive Overview of Large Language Models 返回论文和资料目录 论文地址 1.导读 相比今年4月的中国人民大学发表的大模型综述&#xff0c;这篇综述角度更侧重于大模型的实现&#xff0c;更加硬核&#xff0c;更适合深入了解大模型的一…

运动型蓝牙耳机什么牌子好?市面上热门的运动耳机推荐

​随着生活节奏的加快&#xff0c;越来越多的人开始关注健康和运动。而在运动的时候&#xff0c;佩戴耳机听音乐已经成为了很多人的选择。但是&#xff0c;市面上的运动耳机种类繁多&#xff0c;如何选择一款适合自己的呢&#xff1f;下面&#xff0c;我推荐几款市面上热门的运…

开源社区团购小程序源码系统 商品管理+订单管理+会员管理 带完整搭建教程

社区团购作为一种新型的电商模式&#xff0c;逐渐成为了人们日常生活的一部分。而开源社区团购小程序源码系统&#xff0c;更是受到了广大开发者的热烈欢迎。下面罗峰给大家介绍一款完整的开源社区团购小程序源码系统&#xff0c;包括商品管理、订单管理、会员管理等功能&#…