【vue3|第29期】Vue3中的插槽:实现灵活的组件内容分发

日期:2024年10月24日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉在这里插入代码片有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006

说在最前面:本文 vue3 的示例代码,在没有另外声名的情况下,均采用 <script setup> 组合式代码风格,风格统一,避免混乱,请各位新老食客放心食用哈 ^ _ ^


文章目录

  • 一、前言
  • 二、插槽分类
    • 1、 默认插槽(Default Slot)
    • 2、 具名插槽(Named Slots)
    • 3、 作用域插槽(Scoped Slots)
  • 三、完整示例
  • 四、结语


在这里插入图片描述


一、前言


Vue3 中,插槽(Slots 是一种允许开发者在组件内部定义可替换内容的机制。即通过插槽,开发者在组件内部预留“空白区”,供父组件填充自定义内容。这不仅增强了组件的通用性和复用性,还实现了父组件对子组件内容的精确控制。

二、插槽分类


1、 默认插槽(Default Slot)

默认插槽(也称为匿名插槽,无名插槽)是最常见的插槽类型,用于放置普通的 HTML 内容或子组件。如果一个组件没有指定具名插槽,那么所有的内容都会被视为默认插槽的内容。

假设我们有一个子组件 ChildComponent.vue,它包含一个默认插槽:

<template>
  <div>
    <h2>我是子组件的标题</h2>
    <slot></slot> <!-- 默认插槽 -->
  </div>
</template>

在父组件中,我们可以这样使用它:

<template>
  <ChildComponent>
    <p>这是通过默认插槽插入的内容</p >
  </ChildComponent>
</template>

渲染后的HTML结构将是:

<div>
  <h2>我是子组件的标题</h2>
  <p>这是通过默认插槽插入的内容</p >
</div>

2、 具名插槽(Named Slots)

允许在组件中定义多个插槽,并为每个插槽指定一个唯一的名称。父组件可以通过 v-slot 指令指定内容应该渲染到哪个具名插槽中。在 Vue3 中,也可以使用 # 来简化 v-slot 指令,像 <template #header> 这样的写法。

当我们需要在一个组件中定义多个插槽时,具名插槽就派上用场了。下面是一个包含头部和尾部具名插槽的子组件:

<template>
  <div>
    <header>
      <slot name="header"></slot> <!-- 具名插槽 -->
    </header>
    <main>
      <slot></slot> <!-- 默认插槽 -->
    </main>
    <footer>
      <slot name="footer"></slot> <!-- 具名插槽 -->
    </footer>
  </div>
</template>

在父组件中,我们可以这样插入内容:

<template>
  <ChildComponent>
    <template v-slot = "header">
      <h1>这是头部具名插槽的内容</h1>
    </template>
    <p>这是默认插槽的内容</p >
    <template #footer>
      <p>这是尾部具名插槽的内容</p >
    </template>
  </ChildComponent>
</template>

渲染后的HTML结构将是:

<div>
  <header>
    <h1>这是头部具名插槽的内容</h1>
  </header>
  <main>
    <p>这是默认插槽的内容</p >
  </main>
  <footer>
    <p>这是尾部具名插槽内容</p >
  </footer>
</div>

3、 作用域插槽(Scoped Slots)

允许父组件访问子组件的数据。通过在子组件的插槽上定义属性,父组件可以接收这些属性,并在插槽内容中使用它们。

作用域插槽允许子组件向父组件传递数据,父组件可以根据这些数据来决定如何渲染内容。下面是一个简单的例子:

子组件 ChildComponent.vue

<template>
  <div>
    <slot :user="user"></slot> <!-- 作用域插槽 -->
  </div>
</template>

<script setup>
import { ref } from 'vue';

const user = ref({ name: 'Commas', age: 30 });
</script>

在父组件中,我们可以这样使用作用域插槽:

<template>
  <ChildComponent v-slot:default="slotProps">
    <p>用户名: {{ slotProps.user.name }}</p >
    <p>年龄: {{ slotProps.user.age }}</p >
  </ChildComponent>
</template>

渲染后的HTML结构将是:

<div>
  <p>用户名: Commas</p >
  <p>年龄: 30</p >
</div>

三、完整示例

假设我们要创建一个 可自定义的按钮组件(Button.vue),它包含主文本图标两个部分,如下所示:

<!-- Button.vue -->
<script setup>
import { ref } from 'vue';
</script>

<template>
  <div class="button">
    <slot name="text">默认文本</slot>
    <slot name="icon">
      <!-- 默认图标 -->
      <i class="material-icons">add</i>
    </slot>
  </div>
</template>

父组件使用:

<template>
  <Button>
    <template #text>定制文本</template>
    <template #icon>
      <i class="material-icons">delete</i>
    </template>
  </Button>
</template>

四、结语


通过本文的探讨,我们不仅领略了 Vue3 插槽的强大功能,更深入理解了其在构建高性能、高复用性 UI 组件中的关键作用。通过默认插槽、具名插槽和作用域插槽,开发者可以定义组件的结构,并允许父组件自定义这些结构。这些机制使得Vue组件更加灵活和可重用。


参考文章:

  • 《Vue 3 官方文档 - 插槽》
  • 《Vue Composition API - 使用指南》

版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/143206817

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多款云存储平台存在安全漏洞,影响超2200万用户

据苏黎世联邦理工学院研究人员Jonas Hofmann和Kien Tuong Turong的发现&#xff0c;端到端加密&#xff08;E2EE&#xff09;云存储平台存在一系列安全问题&#xff0c;可能会使用户数据暴露给恶意行为者。在通过密码学分析后&#xff0c;研究人员揭示了Sync、pCloud、Icedrive…

docker中部署mysql时一直报Get“http://“

原因是使用阿里镜像是网速过慢的问题 解决方式&#xff1a;重新配置镜像 j解决docker: Error response from daemon: Get “https://registry-1.docker.io/v2/“: net/http: request canc-CSDN博客

深度学习--CNN实现猫狗识别二分类(附带下载链接, 长期有效)

1. 代码实现(包含流程解释) 样本量: 8005 # # 1.导入数据集(加载图片)数据预处理# 进行图像增强, 通过对图像的旋转 ,缩放,剪切变换, 翻转, 平移等一系列操作来生成新样本, 进而增加样本容量, # 同时对图片数值进行归一化[0:1] from tensorflow.keras.preprocessing.image …

2024/10/27周报

文章目录 摘要Abstract深度学习预测进出水水质使用UCI机器学习库中的水处理数据集代码描述具体代码示例实验结果 智能比对示例数据示例比对步骤Python 代码示例结果解读应用场景 总结改进建议 摘要 本周对南宁伶俐工业园区污水处理厂进行调研&#xff0c;了解了该污水处理厂的…

H5实现PDF文件预览,使用pdf.js-dist进行加载

H5实现PDF文件预览&#xff0c;使用pdf.js-dist进行加载 一、应用场景 在H5平台上预览PDF文件是在原本已经开发完成的系统中新提出的需求&#xff0c;原来的系统业务部门是在PC端进行PDF的预览与展示&#xff0c;但是现在设备进行了切换&#xff0c;改成了安卓一体机进行文件…

记一次真实项目的性能问题诊断、优化(阿里云redis分片带宽限制问题)过程

前段时间&#xff0c;接到某项目的压测需求。项目所有服务及中间件&#xff08;redis、kafka&#xff09;、pg库全部使用的阿里云。 压测工具&#xff1a;jmeter(分布式部署)&#xff0c;3组负载机&#xff08;每组1台主控、10台linux 负载机&#xff09; 问题现象&#xff1…

基于SSM的网上购物系统的设计与实现

技术介绍 本系统运用了JSP技术、SSM框架、B/S架构和myspl数据库 MySQL 介绍 MySQL是一种关系型的数据库管理系统&#xff0c;属于Oracle旗下的产品。MySQL的语言是非结构化的&#xff0c;使用的用户可以在数据上进行工作。这个数据库管理系统一经问世就受到了社会的广泛关注…

神仙公司名单(成都)

神仙公司&#xff08;成都&#xff09; 神仙公司&#xff0c;继续。 最近对古城很感兴趣&#xff0c;加上前两周吃的串串还记忆犹新&#xff0c;这期写一下四川省省会&#xff1a;成都。 在互联网人眼中&#xff0c;成都似乎是一个存在感很低的城市&#xff0c;但实际上成都一直…

【电机控制】相电流重构——单电阻采样方案

【电机控制】相电流重构——单电阻采样方案 文章目录 [TOC](文章目录) 前言一、基于单电阻采样电流重构技术原理分析1.1 单电阻采样原理图1.2 基本电压矢量与电流采样关系 二、非观测区2.1 扇区过渡区2.2 低压调制区 三、非观测区补偿——移相法四、参考文献总结 前言 使用工具…

C语言实现栈和队列

代码已经上传我的资源&#xff0c;需要可自取 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&…

Python实现贝叶斯优化器(Bayes_opt)优化简单循环神经网络分类模型(SimpleRNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 贝叶斯优化器 (BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。 贝叶斯…

Linux资源与网络请求

参数说明&#xff1a; d : 改变显示的更新速度&#xff0c;或是在交谈式指令列( interactive command)按 sq : 没有任何延迟的显示速度&#xff0c;如果使用者是有 superuser 的权限&#xff0c;则 top 将会以最高的优先序执行c : 切换显示模式&#xff0c;共有两种模式&#…

软件测试岗位,职业前景到底怎样?

最近经常被问到软件测试这个行业的前景&#xff0c;网上也有大量唱衰测试这个行业的声音&#xff0c;很多选择职业方向的同学对是否要进入这个职业也非常迷茫。 所以开一贴来聊一聊秋草对软件测试这个岗位的要求以及对其前景的看法。 软件测试到底是个什么样的岗位&#xff1…

如何学习cuda编程?

第一本cuda教材: CUDA By Example​ developer.nvidia.com/cuda-example 配套网课&#xff1a; Udacity CS344: Intro to Parallel Programming​ developer.nvidia.com/udacity-cs344-intro-parallel-programming 记得做网课作业。 然后就靠项目上手了。 我当时实习时候的项…

ProTable样式缺失

在使用Ant Design Pro开发页面时&#xff0c;想要引用ProComponents组件中的ProTable表格&#xff0c;引入官方文档的案例发现缺少样式 官方文档地址ProTable - 高级表格 - ProComponents (ant.design) 引入的是第一个Demos 样式预览&#xff1a; 代码 import { EllipsisO…

今天不分享技术,分享秋天的故事

引言 这个爱情故事好像是个悲剧&#xff0c;你说的是婚姻。爱情没有悲剧&#xff0c;对爱者而言&#xff0c;爱情怎么会是悲剧呢。对春天而言&#xff0c;秋天是它的悲剧吗。结尾是什么&#xff0c;等待&#xff0c;之后呢&#xff0c;没有之后。或者说&#xff0c;等待的结果…

Spring Cloud微服务

Spring Cloud 是一个专注于微服务架构的一站式解决方案&#xff0c;它通过整合多个优秀的开源框架和工具&#xff0c;为开发者提供了构建、管理和维护微服务系统所需的全方位支持。以下是关于 Spring Cloud 微服务的详细介绍&#xff1a; 基本概念 微服务架构&#xff1a;微服务…

图像处理算法的形式

一 基本功能形式 按图像处理的输出形式&#xff0c;图像处理的基本功能可分为三种形式。 1&#xff09;单幅图像 -------->单幅图像 2&#xff09;多幅图像-------->单幅图像 3&#xff09;单(或多)幅图像------->数字或符号符 二 几种具体算法形式 1.局部处理 …

搭建 mongodb 副本集,很详细

搭建 mongodb 副本集&#xff0c;很详细 一、前言二、创建用户1、创建 root 用户2、创建测试用户3、修改用户密码 三、修改配置文件&#xff08;主节点&#xff09;1、开启登录认证2、加上副本集3、最终配置文件 四、副本节点1、创建副本节点目录2、编辑配置文件3、启动副本节点…

力扣283-- 移动零

开始做梦的地方 力扣283 &#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 何解&#xff1f; 1&#xff0c;暴力枚举&#xff1a…