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

深入浅出 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

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

相关文章:

深入浅出 Vue 中的插槽 slot

深入浅出 Vue 中的插槽 slot start 最近被问到好几次 Vue 中的插槽相关知识&#xff0c;掌握的还是有些不全面。抱着重新学习的心态&#xff0c;写这篇博客。首先对基础知识做一个回顾&#xff0c;然后再对源码实现做一个学习。作者&#xff1a;番茄编写时间&#xff1a;2023…...

postgreSQL 查询所有模式的语句

场景 postgre 数据库下携带模式的分组 sql select schema_name from information_schema.schemata;...

pandas教程:Introduction to scikit-learn scikit-learn简介

文章目录 13.4 Introduction to scikit-learn&#xff08;scikit-learn简介&#xff09; 13.4 Introduction to scikit-learn&#xff08;scikit-learn简介&#xff09; scikit-learn是一个被广泛使用的python机器学习工具包。里面包含了很多监督式学习和非监督式学习的模型&a…...

Linux配置路由功能及添加静态路由

一、配置路由功能 Linux作为路由器&#xff0c;Linux本身就具备路由功能&#xff0c;开启方式如下&#xff1a; 临时开启&#xff1a; echo "1" > /proc/sys/net/ipv4/ip_forward永久开启&#xff1a; vim /etc/sysctl.confnet.ipv4.ip_forward1 # 配置生效 sys…...

什么是Geo Trust OV证书

一、GeoTrust OV证书的介绍 GeoTrust OV证书是由GeoTrust公司提供的SSL证书&#xff0c;它是一种支持OpenSSL的数字证书&#xff0c;具有更高的安全性和可信度。GeoTrust是全球领先的网络安全解决方案提供商&#xff0c;为各类用户提供SSL证书和信任管理服务。GeoTrust OV证书…...

selenium 工具 的基本使用

公司每天要做工作汇报&#xff0c;汇报使用的网页版&#xff0c; 所以又想起 selenium 这个老朋友了。 再次上手&#xff0c;发现很多接口都变了&#xff0c; 怎么说呢&#xff0c; 应该是易用性更强了&#xff0c; 不过还是得重新看看&#xff0c; 我这里是python3。 pip安装…...

Excel如何比较两列数据的不同

当遇到exel有两个列表的数据&#xff0c;需要比较得到他们的不同的部分&#xff0c;并且得到一个不同的值的列表。示例如下&#xff1a; 目的是&#xff1a;通过比较&#xff0c;知道Column2的哪些值不在在Column1里。 WPS直接提供了这一个功能&#xff0c;如下图&#xff1a;…...

力扣labuladong——一刷day47

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣993. 二叉树的堂兄弟节点二、力扣1315. 祖父节点值为偶数的节点和三、力扣1448. 统计二叉树中好节点的数目四、力扣1469. 寻找所有的独生节点 前言 二叉…...

蓝桥杯-02-python组考点与14届真题

文章目录 蓝桥杯python组考点与14届真题参考资源python组考点1. 组别2. 竞赛赛程3. 竞赛形式4. 参赛选手机器环境5. 试题形式5.1. 结果填空题5.2. 编程大题 6. 试题考查范围7. 答案提交8. 评分9. 样题样题 1&#xff1a;矩形切割&#xff08;结果填空题&#xff09;样题 2&…...

【0240】源码分析PG内核中的关键字列表(SQL keywords)

相关文章: 【0236】聊一聊PG内核中的命令标签(Command Tags、CommandTag、tag_behavior) 【0239】从编译原理角度理解 #include “xxx“ 或 #include<xxx> 的实现机制 1. PostgreSQL的SQL关键字列表(SQL Keywords) 1.1 keywords.c源文件内容 keywords.c源文件中的内容…...

【Python深度学习第二版】学习笔记之——什么是深度学习

机器学习是将输入&#xff08;比如图像&#xff09;映射到目标&#xff08;比如标签“猫”&#xff09;的过程。 这一过程是通过观察许多输入和目标的示例来完成的。 深度神经网络通过一系列简单的数据变换&#xff08;层&#xff09;来实现这种输入到目标的映射&#xff0c;这…...

ddns-go部署在linux虚拟机

ddns-go部署ubuntu1804 1.二进制部署 1.虚拟机部署 1.下载linux的x86二进制包 wget https://github.com/jeessy2/ddns-go/releases/download/v5.6.3/ddns-go_5.6.3_linux_x86_64.tar.gz2.解压 tar -xzf ddns-go_5.6.3_linux_x86_64.tar.gz3.拷贝执行文件到PATH下&#xff0c…...

LeetCode Hot100 543.二叉树的直径

题目&#xff1a; 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 方法&#xff1a;灵神 代码&#xff1a; ​…...

Breadcrumb面包屑(antd-design组件库)简单用法和自定义分隔符

1.Breadcrumb面包屑 显示当前页面在系统层级结构中的位置&#xff0c;并能向上返回。 2.何时使用 当系统拥有超过两级以上的层级结构时&#xff1b; 当需要告知用户『你在哪里』时&#xff1b; 当需要向上导航的功能时。 组件代码来自&#xff1a; 面包屑 Breadcrumb - Ant Des…...

Mybatis 源码搭建

文章目录 源码下载测试模块搭建学习博客 源码下载 首先下载mybatis-parent的源码&#xff1a;gitee地址 > https://gitee.com/callback_lab/mybatis-parent.git 然后下载mybatis的源码&#xff1a;gitee地址 > https://gitee.com/callback_lab/mybatis-src.git 带中文…...

shell编程系列(5)-函数的定义

文章目录 前言函数定义处理函数参数通过getopts接收参数 前言 函数是编程语言中最重要的部分之一&#xff0c;虽然在shell脚本中并不是必须的&#xff0c;但是函数可以提高代码的复用性和可读性&#xff0c;当我们编写稍微复杂的脚本时&#xff0c;函数就是一个好帮手&#xf…...

鸿蒙应用开发-初见:入门知识、应用模型

基础知识 Stage模型应用程序包结构 开发并打包完成后的App的程序包结构如图 开发者通过DevEco Studio把应用程序编译为一个或者多个.hap后缀的文件&#xff0c;即HAP一个应用中的.hap文件合在一起称为一个Bundle&#xff0c;bundleName是应用的唯一标识 需要特别说明的是&…...

通过测试驱动开发(TDD)的方式开发Web项目

最近在看一本书《Test-Driven Development with Python》&#xff0c;里面非常详细的介绍了如何一步一步通过测试驱动开发(TDD)的方式开发Web项目。刚好这本书中使用了我之前所了解的一些技术&#xff0c;Django、selenium、unittest等。所以&#xff0c;读下来受益匪浅。 我相…...

技巧-PyCharm中Debug和Run对训练的影响和实验测试

简介 在训练深度学习模型时&#xff0c;使用PyCharm的Debug模式和Run模式对训练模型的耗时会有一些区别。 Debug模式&#xff1a;Debug模式在训练模型时&#xff0c;会对每一行代码进行监视&#xff0c;这使得CPU的利用率相对较高。由于需要逐步执行、断点调试、查看变量值等操…...

【古月居《ros入门21讲》学习笔记】07_创建工作空间和功能包

目录 说明&#xff1a; 1. 工作空间(workspace) 结构&#xff1a; 2. 创建工作空间和功能包 创建工作空间 编译工作空间 创建功能包 设置环境变量 3. 注意 同一个工作空间下&#xff0c;不能存在同名的功能包&#xff1b; 不同工作空间下&#xff0c;可以存在同名的功…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...