当前位置: 首页 > news >正文

Vue 插槽 slot

solt 插槽需要分为 2.6.0 版本以上和 2.6.0版本以下。

2.6.0 版本以下的 slot 插槽在,2.x版本将继续支持,但是在 Vue 3 中已被废弃,且不会出现在官方文档中。

作用

插槽 prop 允许我们将插槽转换为可复用的模板,这些模板可以基于输入的 prop ( 也就是在使用者中传递的内容 ) 渲染出不同的内容。这在设计封装数据逻辑同时允许父级组件自定义部分布局的可复用组件时是最有用的。

2.6.0 版本及以上

 在 2.6.0 中,Vue 为具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。它取代了 slot 和 slot-scope 这两个目前已被废弃但未被移除且仍在文档中的 attribute。

默认插槽: 当组件中未提供任何插槽内容时,展示默认的内容。如提供了内容,则替代默认内容  ( 只管挖坑,不管怎么用,反正我都丢进去)

 Category 组件:分类组件,插槽中提供默认内容

<template><div><p>游戏列表</p><slot>当没有外部内容填充时,我会展示</slot></div>
</template>

 App 组件:使用  Category 组件,且不提供插槽内容。

<template><div id="app"><Category/></div>
</template>

只展示默认内容。 

 当 App 组件中提供插槽内容时:Category 组件就不能使用自闭合,需要使用双标签形式。此时 Vue 会将 组件标签中 的内容在 App 组件中解析完成之后,丢到 Category 组件 中,将 slot 替换

<template><div id="app"><Category><p>这是 App 组件提供的内容</p>  </Category></div>
</template>

提供的内容会覆盖默认内容 

具名插槽:顾名思义就是有个名字的插槽( 给这个坑取了个名字,使用的时候可以指定往这个坑里面填东西 ) --- v-slot:xxx 只能存在于  <template> 标签中 ( ps : 存在一种情况可以直接写在组件标签上)

Category 组件:分类组件,插槽中提供 name 属性,作为该插槽名称。若是不提供 name 属性,则默认带有隐含的名字“default”,作为默认插槽

<template><div><p>游戏列表</p><slot name="header">这是头部</slot> <br><slot>这是内容</slot> <br></div>
</template>

App组件:通过 v-slot 指令,绑定对应的插槽名称 ( name 属性),就能将内容分发到指定插槽中。

<template><div id="app"><Category><template  v-slot:header><p>传递的头部</p></template><template><p>传递的内容</p></template></Category></div>
</template>

 但是,如果 Category 组件中存在多个 slot 插槽,任何没有被包裹在带有 v-slot 的 <template> 中的内容都会被视为默认插槽的内容。

具名插槽也可以和 v-bind 、v-on 一样进行缩写,v-slot: 缩写成 #。如下所示。但是切记一点:如果你想使用缩写,那么必须给一个明确的插槽name,即使是 default 也要写上。要么就不写#,直接为默认插槽,否则会报错

// 全写
<Category><template v-slot:gameList>xxx</template>
</Category>// 简写
<Category><template #gameList>xxx</template>
</Category>// 默认插槽简写完整
<Category><template #default>xxx</template>
</Category>// 默认插槽简写不完整报错
<Category><template #>xxx</template>
</Category>

 作用域插槽:在使用组件时,让使用者中提供的插槽内容能够访问子组件中才有的数据。父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

 Category 组件:分类组件,组件中带有游戏分类数据。

<template><div><p>游戏列表</p><slot></slot></div>
</template><script>
export default {data() {return {games:['lol','dota','刺客信条','只狼']}},
}
</script>

App 组件:使用 Category 组件中的数据渲染出不同的效果、分别渲染为 有序列表,无序列表、h4

<template><div id="app"><Category><ul><li v-for="(game,index) in games" :key="index"><p>{{ game }}</p></li></ul></Category></div>
</template>

代码写的很流畅,看起来完全没毛病,但是控制台报错了啊。 

 翻译过来就是:属性或方法“games”不是在实例中定义的,而是在渲染过程中引用的。通过初始化属性,确保该属性是可响应的,无论是在data选项中,还是对于基于类的组件。

这说明了啥?在 App 组件中报了这个错,games 不存在,肯定不存在啊,我的 games 数据是存在 <Category> 组件中的啊,在 <Category> 组件中随便你怎么使用都没毛病。但是 App 组件自己没定义,还要强行使用,那咋行。

所以 Vue 使用了 v-bind 指令( 简写为 : ),让 使用者App组件 能够访问到被使用者 <Category> 组件中的数据

<Category> 组件中,通过 v-bind 指令给 slot 插槽绑定了 games 属性,传递的数据就是 games。从此, <Category> 组件 的使用者,只要接收 games 数据,就可以使用。

<template><div><p>游戏列表</p><slot v-bind:games="games"></slot><!-- <slot :games="games"></slot> --></div>
</template>

App组件,通过使用 <Category> 组件,且在  <template> 标签中 通过 v-slot 指令获取数据即可使用。( 这里的 :default 对应上面的,当 slot 插槽未指定 name 属性时,默认自带 default ,可以省略。如果是具名插槽,则指定 对应的 name 属性进行渲染 )

<template><div id="app"><Category><template v-slot:default='slotProps'><!-- <template v-slot='slotProps'> --><ul><li v-for="(game, index) in slotProps.games" :key="index"><p>{{ game }}</p></li></ul></template></Category></div>
</template>

 <template> 标签中 通过 v-slot='slotProps' 接收了这个 slotProps,这个名字是随便定义的,对应的就是  <Category> 组件中 <slot> 中绑定的 games 数据。slotProps 是一个对象,键值对就是绑定的 { games:['lol','dota','刺客信条','只狼'] }。所以在使用中,还需要通过  slotProps.games 。 

 当然,也存在简写方式,那就是 es6 的解构。可以将 slotProps 中的值解构出来直接使用。也可以 重命名,添加默认值等 解构赋值的常用操作

// 单纯解构
<Category><template v-slot:default={games}><ul><li v-for="(game, index) in games" :key="index"><p>{{ game }}</p></li></ul></template>
</Category>// 解构 + 重命名 将 games 重命名未 aaa
<Category><template v-slot={games:aaa}>xxx</template>
</Category>// 解构 + 设置默认值
<Category><template v-slot={games:['恐龙快打']}>xxx</template>
</Category>

动态插槽名:当你的插槽名称不固定,而是根据情况而变化时,你就需要使你的插槽名称是动态的

在 官方文档--模板语法--指令中,存在一个动态参数,具体如下,限制内容请查看文档。

// 这里的 attributeName 会被作为一个 JavaScript 表达式进行动态求值,求得的值将
// 会作为最终的参数来使用。例如,如果你的 Vue 实例有一个 attributeName,其值为 "href",
// 那么这个绑定将等价于 v-bind:href。
<a v-bind:[attributeName]="url"> ... </a>

所以 <slot> 插槽也借鉴了这个方法,实现了 动态插槽名

<Category><template v-slot:[这是动态插槽名称]>xxx</template>
</Category>

 独占默认插槽:在传递数据的前提下,如果被提供的内容只有默认插槽时组件的标签才可以被当作插槽的模板来使用。之前说过 v-slot 必须写在   <template> 标签中,只有一种情况除外,说的就是这个情况。

如果我的 <Category> 组件 中只存在一个默认插槽。且传递了数据

<template><div><p>游戏列表</p><slot :games="games"></slot></div>
</template>

那么这个默认插槽在被使用时,v-slot 指令,可以直接作用在 <Category> 组件标签上,可以简写为 <Category v-slot={games}>

<template><div id="app"><Category v-slot:default={games}>{{ games }}</Category></div>
</template>

这里说一下为啥需要这个 games:如果不接受参数,那是不是就直接是默认插槽,都默认插槽了,还写个锤子的 v-slot 指令啊,直接怼代码不就完事了。

2.6.0版本以下语法

事先声明,在接下来所有的 2.x 版本中 slot 和 slot-scope 属性仍会被支持,但已经被官方废弃且不会出现在 Vue 3 中。

slot:类比于上面的 v-solt,作用于具名插槽与默认插槽,与 v-solt 不同的是,solt 可以写在 <template> 标签中,也可以使用在一个普通元素上。不存在简写方式。

<Category> 组件中存在三个插槽,一个是默认插槽,两个是具名插槽

<template><div><p>游戏列表</p><slot name="header"></slot><slot></slot><slot  name="footer"></slot></div>
</template>

App 组件中,分别用 <template> 标签 + slot 指定具名插槽 header,普通元素 p 标签 + slot 指定具名插槽 footer,纯元素的默认插槽,来实现效果

<template><div id="app"><Category><template slot='header'>这是头部</template><p>这是内容</p><p slot="footer">这是底部</p></Category></div>
</template>

 展示结果如下,具名插槽一一对应,默认插槽内容页分发到了正确位置。

slot-scope:作用域插槽,同样可以写在 <template> 标签中,也可以使用在一个普通元素上。用法和新版本的 v-slot 作用域插槽一致,可以解构,只是语法不一致

<Category> 组件中存在只存在一个具名插槽,且通过 v-bind: 绑定数据

<template><div><p>游戏列表</p><slot name="header" v-bind="games"></slot></div>
</template>

App 组件中, 通过 slot-scope 接收参数,通过 slot 指定具名插槽 进行渲染。

<Category><template slot='header' slot-scope="games">{{ games }}</template>
</Category>

通过作用域插槽,可以实现 在复用模板的情况下,渲染出不同的 布局和样式。因为 作用域插槽的渲染实际上是受 父级使用者控制的。将数据传递给 使用者后,使用者可以在自己主见内部随意使用,任意布局。

<Category> 组件中代码不变

<template><div><p>游戏列表</p><slot name="header" v-bind="games"></slot></div>
</template>

App 组件中 使用 <Category> 组件 进行不同的布局

<template><div id="app"><Category><template slot='header' slot-scope="games"><ul><li v-for="(item,index) in games" :key="index">{{ item }}</li></ul></template></Category><Category><template slot='header' slot-scope="games"><span style="color:red" v-for="(item,index) in games" :key="index">{{ item }}</span></template></Category></div>
</template>

 这就是插槽的便利之处

 

相关文章:

Vue 插槽 slot

solt 插槽需要分为 2.6.0 版本以上和 2.6.0版本以下。 2.6.0 版本以下的 slot 插槽在&#xff0c;2.x版本将继续支持&#xff0c;但是在 Vue 3 中已被废弃&#xff0c;且不会出现在官方文档中。 作用 插槽 prop 允许我们将插槽转换为可复用的模板&#xff0c;这些模板可以基于…...

【C/C++】C语言位图操作实例(亲测)

C语言中的位图操作通常用于处理大量的二进制数据&#xff0c;例如图像处理、压缩算法等。以下是一些C语言中的位图操作实例&#xff1a; 设置位图中的某一位 void set_bit(unsigned char *bitmap, int bit) {bitmap[bit / 8] | (1 << (bit % 8)); }这个函数将位图中的第…...

Mahout教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Mahout 是 Apache Software Foundation&#xff08;ASF&#xff09; 旗下的一个开源项目&#xff0c;提供一些可扩展的机器学习领域经典算法的实现&#xff0c;旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现&#xff0c;包括聚类、分类、推荐…...

wxwidgets Ribbon使用wxRibbonToolBar实例

wxRibbonToolBar就是工具栏&#xff0c;一下是实现的效果&#xff0c;界面只是功能展示&#xff0c;没有美化 实现代码如下所示&#xff1a; MyFrame::MyFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(800, 600)) …...

8.9黄金最新行情走势分析及短线交易策略

近期有哪些消息面影响黄金走势&#xff1f;黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周三&#xff08;8月9日&#xff09;现货黄金维持震荡&#xff0c;目前交投于1930美元附近&#xff0c;隔日现货黄金盘中震荡下行&#xff0c;失守1930关口并在美盘时段…...

VB+SQL房地产评估系统设计与实现

摘 要 房地产评估系统对房地产评估信息进行全面现代化管理。但一直以来人们使用传统人工的方式进行评估,这种管理方式存在着许多缺点,如:效率低、计算量大,容易出错。另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。 随着科学技术的不断…...

用AOP实现前端传参时间的时区转化

用AOP实现前端传参时间的时区转化 新增注解新增AOP切面类Controller传参字段添加注解结束 新增注解 Documented Target({FIELD,METHOD,PARAMETER,ANNOTATION_TYPE}) Retention(RUNTIME) public interface MyDateFormatDeserializer {String pattern() default "yyyy-MM-d…...

mybatis There is no getter for property named ‘*‘ in ‘class java.lang.String

mybatis There is no getter for property named car_port_ids in class java.lang.String 出现这种错误我这边是mapper.xml子查询字段不对导致的 我把查询结果的列的字段放进去结果不识别car_port_ids可能我这种字段本身就有问题 技术博客 http://idea.coderyj.com/ 1.解决 &…...

Mac终端前总会出现 (base) 字样解决

Mac安装了anaconda之后&#xff0c;终端前总会出现 (base) 字样&#xff0c;显示如下&#xff1a; (base) tinghoudeiMac ~ 具体原因是 安装了anaconda后&#xff0c;每次启动终端都会启动anaconda的base环境。 解决办法 设置anaconda 不自启base环境就好了&#xff1a; 禁用…...

RabbitMQ面试题大全含答案

rabbitmq 的使用场景有哪些&#xff1f; ①. 跨系统的异步通信&#xff0c;所有需要异步交互的地方都可以使用消息队列。就像我们除了打电话&#xff08;同步&#xff09;以外&#xff0c;还需要发短信&#xff0c;发电子邮件&#xff08;异步&#xff09;的通讯方式。 ②. 多…...

Linux配置QT Creator环境:ubuntu中安装QT Creator环境

一、前景 目前市面上很多公司使用QT Creator进行界面开发&#xff0c;基本都会选择在Linux环境进行&#xff0c;优点不仅是市场所需&#xff0c;更是方便后期代码的移植&#xff0c;相较于Windows系统&#xff0c;Linux系统移植性非常好。故此篇文章&#xff0c;介绍如何在Linu…...

机器学习深度学习——池化层

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——卷积的多输入多输出通道 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们…...

siMLPe:Human Motion Prediction

Back to MLP: A Simple Baseline for Human Motion Prediction解析 摘要1. 简介2. Related Work2.1 基于RNN的人体运动预测2.2 基于GCN的人体运动预测2.3 基于 Attention 的人类运动预测2.4 总结 3. siMLPe3.1 离散余弦变换&#xff08;Discrete Cosine Transform (DCT)&#x…...

详解——JS map()方法

JavaScript是一种广泛使用的编程语言&#xff0c;用于开发Web应用程序。它具有许多内置函数和方法&#xff0c;其中之一是map()方法。map()方法是一个非常有用的函数&#xff0c;它允许我们在数组中的每个元素上执行相同的操作&#xff0c;并返回一个新的数组。 map()方法的语…...

leetcode做题笔记57

给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可以合并区间&#xff09;。 思路一&#xff1a;模拟题意 int pushbackInterval(int…...

SAP Fiori 将GUI中的自开发报表添加到Fiori 工作台

1. 首先我们在workbench 中开发一个GUI report 这里我们开发的是一个简单的物料清单报表 2. 分配一个事务代码。 注意这里的SAP GUI for HTML 要打上勾 3. 创建语义对象&#xff08; Create Semantic Object&#xff09; 事物代码&#xff1a; path: SAP NetWeaver ->…...

【Docker】配置指定大小的磁盘空间

背景 测试磁盘满时程序的运行情况 问题 如何使用 docker 来模拟磁盘满的情况 解决方法 创建指定大小的数据卷 volumedocker volume create --driver local --opt typetmpfs --opt devicetmpfs --opt osize50M my_volumn创建 docker 时&#xff0c;使用该数据卷docker run …...

使用Spring五大注解来更加简单的存储Bean对象

在使用Spring框架的时候我们如果使用这种方式来存储bean对象的话未免有点太麻烦了 <bean id"xxx" class"xxx"> </bean> 为了简化存储Bean对象的操作&#xff0c;我们可以使用五大类注解来进行存储Bean对象 我们首先要在配置文件配置扫描路径…...

Netty面试题1

计算机网络模型 OSI采用了分层的结构化技术&#xff0c;共分七层&#xff0c; 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 。 Open System Interconnect 简称OSI&#xff0c;是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参…...

水质分析积分球定义和原理

随着社会经济的快速发展&#xff0c;人们对水质的要求不断提升&#xff0c;特别是生活饮用水&#xff0c;检测项目渐趋完善。在工业化大发展的前提下&#xff0c;水资源正遭受着严重的污染&#xff0c;因此确保水质安全&#xff0c;定期开展对饮用水的检测工作已迫在眉睫。环境…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...