深入浅出 Vue 中的插槽 slot

深入浅出 Vue 中的插槽 slot

start

  • 最近被问到好几次 Vue 中的插槽相关知识,掌握的还是有些不全面。
  • 抱着重新学习的心态,写这篇博客。首先对基础知识做一个回顾,然后再对源码实现做一个学习。
  • 作者:番茄
  • 编写时间:2023/11/27

1.什么是插槽?

在日常代码编写的过程中,针对高频出现的业务场景,我会它把封装一个组件,然后多个地方去使用。

但是在某些情况下,一个组件并不能兼容所有的场景。

就比如对话框组件,可能每个人都会用到对话框,但是对话框中的内容会根据需求千变万化。这个时候就要考虑有没有什么方法,可以让我们对话框中的内容变成动态的呢?

答案:有,使用插槽就可以满足我们的需求。

插槽的概念有点类似 JavaScript 中的插值表达式,在代码在保留一个占位符,然后动态的向占位符中传入内容。

// 插值表达式
var name = '番茄'var str = `<div>
我是 ${name}
</div>`

2. 插槽的使用

上面提到了插槽,现在我们结合示例,一步一步学习插槽的用法

1. 父组件引入子组件的基本用法

父组件 app.vue

<template><div id="app"><Son></Son></div>
</template><script>
import Son from "./son.vue";export default {components: {Son,},
};

子组件 son.vue

<template><div class="son"><h1>我是子组件 son</h1></div>
</template>

运行效果

在这里插入图片描述

总结

上面的示例展示了一个基本的父组件使用子组件的用法。

2. 父组件在子组件中传入文本

父组件 app.vue

<template><div id="app"><Son>向子组件中传入文本</Son></div>
</template><script>
import Son from "./son.vue";export default {components: {Son,},
};
</script>

子组件 son.vue

<template><div class="son"><h1>我是子组件 son</h1></div>
</template>

运行效果

在这里插入图片描述

总结

在父组件中使用子组件,当子组件中没有插槽没有 <slot></slot> 的时候,在父组件中向子组件中传递内容,这些内容并不会展示。

3.基础插槽的使用(不传入内容)

父组件 app.vue

<template><div id="app"><Son>  </Son></div>
</template><script>
import Son from "./son.vue";export default {components: {Son,},
};
</script>

子组件 son.vue

<template><div class="son"><h1>我是子组件 son</h1><slot>我是插槽的默认内容</slot></div>
</template>

运行效果

在这里插入图片描述

总结

上面的示例是一个基础的插槽使用演示。父组件使用子组件,但是不向子组件传入内容,此时,展示的内容是 <slot>默认内容</slot> 中默认的内容。

4. 基础插槽的使用(传入内容)

父组件 app.vue

<template><div id="app"><Son>这是我自己DIY的内容</Son></div>
</template><script>
import Son from "./son.vue";export default {components: {Son,},
};
</script>

子组件 son.vue

<template><div class="son"><h1>我是子组件 son</h1><slot>我是插槽的默认内容</slot></div>
</template>

运行效果

在这里插入图片描述

总结:

上面的示例是一个基础的插槽使用演示。父组件使用子组件,且向子组件传入内容。

此时,展示的内容是我们在父组件中传入的内容。此时就可以满足我们定制化的需要了。

这就是最基础的组件使用方法了

5. 同一个子组件,需要多个插槽如何处理?

掌握了插槽的基础使用方法后,会有一个衍生的问题。

如果同一个组件中需要多个插槽,如何处理?

答: 可以使用具名插槽,顾名思义,就是可以给插槽取名字,然后根据名称去匹配插槽。

父组件 app.vue

<template><div id="app"><Son>这是我自己DIY的内容<template v-slot:lazy>LAZY</template><template v-slot:tomato>TOMATO</template></Son></div>
</template><script>
import Son from "./son.vue";export default {components: {Son,},
};
</script>
<style>
#app {width: 400px;height: 400px;background: pink;
}
</style>

子组件 son.vue

<template><div class="son"><h1>我是子组件 son</h1><br /><slot> 我是什么都不写的插槽 </slot><br /><slot name="lazy"> 我是lazy </slot><br /><slot name="tomato"> 我是tomato </slot><br /><slot> 我是什么都不写222 </slot><br /><slot name="lazy"> 我是lazy </slot></div>
</template>
<style>
.son {background: yellow;
}
</style>

运行效果

在这里插入图片描述

总结

由上面的运行效果,我们知道:

  1. 针对一个组件中有多个插槽的情况,我们可以使用 name 对插槽进行命名。然后在父组件中使用插槽的时候,使用 <template> 标签,加上 v-solt:对应插槽名称 的形式匹配到对应的插槽;

  2. 在子组件组件中,没有写 name 属性的插槽,会默认的使用 default 名称,然后匹配没有被 template 标签包裹的内容;

  3. 子组件中相同 name 的插槽可以有多个;

    既然同一个组件中,可以存在多个相同 name 的插槽,是不是可以利用这个特性,实现重复内容的复制?

  4. 在使用v-solt 的时候,注意使用的是: 冒号连接,而且子组件绑定名称的时候, name= 的后面不需要添加引号。

    我在编写示例的时候,将 v-slot:lazy 误写成 v-slot=lazy 的形式了,发现代码并不生效。所以请注意使用的是冒号

    v-slot: 类似 v-on: v-bind: 都是指令,所以这个地方不要弄混淆了。

  5. v-slot:也和 v-on: v-bind: 类似,有语法糖 # 代替即可。

    在这里插入图片描述

  6. v-slot:单词不要打错了!!正确写法: **slot**

6. 作用域插槽

除了具名插槽,还有一种插槽:作用域插槽。

绝大多数情况,上面介绍的两种方式已经满足我们的业务需求了。

  1. 插槽默认值;
  2. 父组件定义插槽内容;

这两种方式,展示的数据和形式,由父组件控制。

但是还有一种情况,就是希望可以拿到子组件的数据,然后父组件控制如何展示。

这个时候就需要使用作用域插槽了。

子组件可以设置插槽的数据,然后数据如何展示,由外部的组件决定。

首先在子组件中绑定一个数据

:sonList="list" :向外暴露的变量名="子组件内部的变量名" > 子组件

子组件 son.vue

<template><div class="son"><h1>我是子组件</h1><br /><slot name="lazy" :sonList="list"> </slot></div>
</template><script>
export default {data() {return {list: [{index: 1,name: '张三',},{index: 2,name: '李四',},{index: 3,name: '王五',},{index: 4,name: '赵六',},],}},
}
</script>

然后就是在父组件区使用我们的子组件,然后定义子组件插槽渲染的内容

v-slot:lazy="data",首先使用v-slot:lazy绑定我们的数据。然后在后面接等于号,用data去接收,然后再用data.子组件暴露的变量名使用

父组件 app.vue

<template><div id="app"><Son><template v-slot:lazy="data">LAZY{{ data.sonList }}</template></Son></div>
</template><script>
import Son from './son.vue'export default {components: {Son,},
}
</script>

在这里插入图片描述

总结

  • 作用域插槽的使用方式:

    v-slot:插槽名="接收的变量名":<template v-slot:插槽名="接收的变量名">

  • 其实本质上就是子组件向外暴露数据,父组件控制子组件具体展示。

小结

本文主要对 Vue 中的插槽的使用做了一个基础说明。

按照插槽的类型区分,可以分为三类:

  1. 默认插槽;
  2. 具名插槽;
  3. 作用域插槽;
  • 默认插槽就是绑定默认的内容;
  • 具名插槽就是给插槽定义名称,用以区分组件;
  • 作用域插槽就是子组件向外暴露数据,由父组件完全控制插槽内容的展示。

end

插槽的使用,整体难度不大。注意一下使用的语法即可。

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

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

相关文章

STM32_10(I2C)

I2C通信 I2C&#xff08;Inter IC Bus&#xff09;是由Philips公司开发的一种通用数据总线两根通信线&#xff1a;SCL&#xff08;Serial Clock&#xff09;、SDA&#xff08;Serial Data&#xff09;同步&#xff0c;半双工带数据应答支持总线挂载多设备&#xff08;一主多从…

QAC支持的静态度量属性

上面介绍了Coverity支持的12个度量属性&#xff0c;下面我们看看QAC这款工具支持的度量属性。下面分成3类&#xff0c;函数度量、文件度量和类度量。 函数度量指标不多&#xff0c;一共有8个。 文件度量度量指标一共10个&#xff0c;如下表。 类度量指标一个8个&#xff0c;如…

python实现C++简易自动压行

突发奇想&#xff0c;想要将自己的c压行之后交上去。但是苦于手动压行效率太低&#xff0c;在网上搜索压行网站没有找到&#xff0c;突然发现压行不就是检查检查去个换行符吗。于是心血来潮&#xff0c;用python实现了一个简易压行程序。 首先&#xff0c;宏定义等带#的文件不…

正则表达式及文本三剑客grep,awk,sed

目录 正则表达式 前瞻 代表字符 表示次数 位置锚定 分组或其他 grep 选项 范例 awk 前瞻 awk常见的内置变量 范例 sed 前瞻 sed格式 范例 搜索替代 格式 范例 分组后项引用 格式 范例 正则表达式 前瞻 通配符&#xff1a;匹配的是文件名 正则表达式&a…

Windows10免安装PostgreSQL

1. PostgreSQL简介2. 下载3. 安装环境4. 安装 4.1. 初始化数据库4.2. 启动数据库4.3. 注册服务4.3. 卸载服务 1. PostgreSQL简介 PostgreSQL 是一种特性非常齐全的自由软件的对象-关系型数据库管理系统&#xff0c;是以加州大学计算机系开发的 POSTGRES 4.2版本为基础的对象关…

java开发需要掌握的maven相关知识和Junit单元测试

maven简介 什么是maven&#xff1a; maven是一款管理和构建java项目的工具&#xff0c;是apache旗下的一个开源项目。 maven的作用&#xff1a; 依赖管理&#xff1a; 方便快捷的管理项目依赖的资源&#xff08;jar包&#xff09;。 项目构建&#xff1a; 标准化的跨平台&#…

开发知识点-CSS样式

CSS样式 fontCSS 外边距 —— 围绕在元素边框的空白区域# linear-gradient() ——创建一个线性渐变的 "图像"# transform ——旋转 元素![在这里插入图片描述](https://img-blog.csdnimg.cn/20191204100321698.png)# rotate() [旋转] # 边框 (border) —— 围绕元素内…

计算机毕业设计php+bootstrap小区物业管理系统

意义&#xff1a;随着我国经济的发展和人们生活水平的提高&#xff0c;住宅小区已经成为人们居住的主流&#xff0c;人们生活质量提高的同时&#xff0c;对小区物业管理的要求也越来越高&#xff0c;诸如对小区的维修维护&#xff0c;甚至对各项投诉都要求小区管理者做得好&…

人工智能-优化算法之梯度下降

梯度下降 尽管梯度下降&#xff08;gradient descent&#xff09;很少直接用于深度学习&#xff0c; 但了解它是理解下一节随机梯度下降算法的关键。 例如&#xff0c;由于学习率过大&#xff0c;优化问题可能会发散&#xff0c;这种现象早已在梯度下降中出现。 同样地&#x…

《微信小程序开发从入门到实战》学习三十四

4.2 云开发JSON数据库 MySQL、Oracle之类的“关系型数据库”。JSON数据库是“非关系型数据库”&#xff0c;没有行表列的概念。 4.2.1 JSON数据库基本概念 集合:一个数据库有多个集合&#xff0c;一个集合存储通常是同一类数据&#xff0c;可看作为JSON数组&#xff0c;数组…

P25 C++ const关键字

前言 本期我们要讲的是 C 中的 const 关键字。 const 在改变生成代码方面做不了什么&#xff0c;它有点像类和结构体的可见性&#xff0c;这是一个机制&#xff0c;可以让我们的代码更加干净&#xff0c;并对开发人员写代码强制特定的规则。 const 就像你做出的承诺&#xf…

王者小游戏

游戏里的经验动物 Bear package beast; import sxt.GameFrame; public class Bear extends Beast {public Bear(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("C:\\Users\\辛欣\\OneDrive\\桌面\\王者荣耀图片(1)\\王者荣耀图片\\beast\\bear.jp…

MacBook如何远程控制华为手机?

将手机屏幕投影到电脑上可以提供更大的屏幕空间&#xff0c;方便观看电影、浏览照片、阅读文档等。然而&#xff0c;除了想将手机投屏到电脑&#xff0c;还想要在电脑上直接操作手机&#xff0c;有方法可以实现吗&#xff1f; 现在使用AirDroid Cast的远程控制手机功能就可以实…

【CVE-2023-49103】ownCloud graphapi信息泄露漏洞(2023年11月发布)

漏洞简介 ownCloud owncloud/graphapi 0.2.x在0.2.1之前和0.3.x在0.3.1之前存在漏洞。graphapi应用程序依赖于提供URL的第三方GetPhpInfo.php库。当访问此URL时&#xff0c;会显示PHP环境的配置详细信息&#xff08;phpinfo&#xff09;。此信息包括Web服务器的所有环境变量&a…

ArkTS-WebView内嵌H5页面

鸿蒙开发使用WebView内嵌H5页面 访问在线网页时需添加网络权限&#xff1a;ohos.permission.INTERNET module.json5文件配置 {"module" : {"requestPermissions":[{"name": "ohos.permission.INTERNET"}]} }踩坑日记 加载网页效果无法…

C# datagridview控件 绑定数据库中表中数据的方式-3

1.如下图所示&#xff0c;为数据库中的一张表结构&#xff0c;注意该表中共有11个字段 2.首先在窗体后台代码中拖入一个datagridview控件&#xff0c;并在窗体加载时&#xff0c;给datagridview控件添加列&#xff0c;添加的方式如下所示&#xff1a;请注意&#xff0c;每个列…

[操作系统] 面试宝典之~死锁连环系列

文章目录 2.22 什么是死锁2.24 解决死锁的方法死锁的预防死锁的避免死锁的检测死锁的解除 2.22 什么是死锁 在多道程序环境下&#xff0c;多个进程可以竞争有限数量的资源。当一个进程申请资源时&#xff0c;如果这时没有可用资源&#xff0c;那么这个进程进入等待状态。有时&…

项目五 配置与管理磁盘

项目五 配置与管理磁盘 磁盘配额&#xff08;Quota&#xff09;&#xff0c;磁盘阵列&#xff08;RAID&#xff09;&#xff0c;逻辑滚动文件系统&#xff08;LVM&#xff09; #职业能力目标和要求 1&#xff0c;掌握Linux下的磁盘管理工具的使用方法 2&#xff0c;掌握Linux…

Kafka事务机制:原理和实践

Kafka事务机制&#xff1a;原理和实践 Apache Kafka 是一个分布式流处理平台&#xff0c;广泛用于构建实时数据管道和流应用程序。它不仅以高吞吐量、可扩展性和容错能力著称&#xff0c;还提供了事务支持&#xff0c;以确保数据的完整性和一致性。在这篇博客中&#xff0c;我…

虚拟公户如何让企业节税

近年来&#xff0c;电商行业迅猛发展&#xff0c;对于从事电商会计工作的人来说&#xff0c;加班已经成为家常便饭。随着移动技术的进步&#xff0c;电商与消费者之间的联系越来越紧密。每次购物节后&#xff0c;大家都非常关注天猫企业商家和电商会计如何通过节税来降低成本。…