当前位置: 首页 > 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;可以存在同名的功…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...