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

news2024/11/27 4:40:31

日期: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

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

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

相关文章

【Linux系统编程】第三十九弹---探索信号处理的奥秘:阻塞信号与sigset_t的深入剖析及实战

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、信号处理 2、阻塞信号 2.1、信号其他相关常见概念 2.2、在内核中的表示 2.3、sigset_t 2.4、信号集操作函数 3、完整…

IDEA解决 properties 文件乱码问题

博主介绍&#xff1a; 计算机科班人&#xff0c;全栈工程师&#xff0c;掌握C、C#、Java、Python、Android等主流编程语言&#xff0c;同时也熟练掌握mysql、oracle、sqlserver等主流数据库&#xff0c;具有丰富的项目经验和开发技能。提供相关的学习资料、程序开发、技术解答、…

三款护眼台灯测评推荐:书客、松下、米家护眼台灯好用吗?

最近护眼台灯非常火&#xff0c;赶上儿子需要换一个学习台灯&#xff0c;于是我开始仔细研究护眼台灯怎么挑&#xff0c;刚好选了三款市面上认可度比较高的三款护眼台灯进行全面详细的护眼测评&#xff0c;书客、松下、米家护眼台灯好用吗&#xff1f;我们通过外观设计、光谱结…

虚拟机桥接模式连不上,无法进行SSH等远程操作

说明&#xff1a;以下情况在window10上遇到&#xff0c;解决后顺便做了个笔记&#xff0c;以防后续再次用到&#xff0c;也给同道中人提供一个解决方案 一、首先按照以下步骤进行检查 1、是否连接了对应的wifi 2、是否设置了桥接模式 3、上述1、2确认无误的情况下请查看右上…

filebeat+elasticsearch+kibana日志分析

1 默认配置 1.1 filebeat filebeat-7.17.yml,从网关中下载k8s的配置&#xff0c;指定es和kibana的配置 通过kibana查询可以查询到日志了&#xff0c;但此时还不知道具体怎么用。 1.2 kibana 在Discover中创建索引格式&#xff1a;filebeat-*&#xff0c;得到如下图&#xf…

HTML练习题:彼岸的花(web)

展示效果: 代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>彼岸の花</title><style…

数据结构 之 二叉树的遍历------先根遍历(五)

提示&#xff1a;本篇章主要讲解数据结构中树的相关知识。 文章目录 二叉树的遍历为什么要提出这么多遍历方法&#xff1f;先根遍历二叉树&#xff08;TLR&#xff09;先根遍历二叉树的递归算法&#xff08;重点&#xff09;先根遍历二叉树的非递归算法(了解&#xff0c;但是得…

【jvm】堆的内部结构

目录 1. 说明2. 年轻代&#xff08;Young Generation&#xff09;2.1 说明2.2 Eden区2.3 Survivor区 3. 老年代&#xff08;Old Generation&#xff09;3.1 说明3.2 对象存放3.3 垃圾回收 4. jdk7及之前5. jdk8及之后 1. 说明 1.JVM堆的内部结构主要包括年轻代&#xff08;You…

开源一款前后端分离的企业级网站内容管理系统,支持站群管理、多平台静态化,多语言、全文检索的源码

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一款前后端分离的企业级网站内容管理系统&#xff0c;支持站群管理、多平台静态化&#xff0c;多语言、全文检索的源码。 前言 在当今的数字化时代&#xff0c;企业网站和个人博客已成为信息传播和品牌建设的重要渠道。…

OpenCV视觉分析之目标跟踪(4)目标跟踪类TrackerDaSiamRPN的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::TrackerDaSiamRPN 是 OpenCV 中用于目标跟踪的一个类&#xff0c;它实现了 DaSiam RPN&#xff08;Deformable Siamese Region Proposal Net…

雷池社区版配置同步试用

雷池社区版配置同步试用 雷池社区版在 7.0.0 版本引入了多节点配置同步 使用步骤 1. 获取连接命令 在主节点点击成为主节点后&#xff0c;会出现一个地址&#xff0c;该地址用于从节点连接主节点&#xff0c;获取主节点的配置&#xff0c;所以要保障从节点能够连接到主节点…

【动手学电机驱动】 STM32-FOC(1)IHM03 电机控制套件的介绍

STM32-FOC&#xff08;1&#xff09;IHM03 电机控制套件的介绍 STM32-FOC&#xff08;2&#xff09;IHM03 电机控制套件的使用 【动手学电机驱动】 STM32-FOC&#xff08;1&#xff09;IHM03 电机控制套件的介绍 1. IHM03&#xff1a;基于 STM32 的电机控制套件1.1 X-NUCLEO-IH…

技术星河中的璀璨灯塔 —— 青云交的非凡成长之路

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

SpringBoot--入门、创建一个SpringBoot项目、测试

一、IDEA配置maven &#xff08;1&#xff09;下载maven maven下载地址&#xff1a;Maven – Download Apache Maven &#xff08;2&#xff09;解压 解压下载好的文件&#xff1a; 创建一个文件夹maven-repository用来充当本地仓库&#xff1a; &#xff08;3&#xff09;配…

无人机避障——使用三维PCD点云生成的2D栅格地图PGM做路径规划

着重介绍通过对三维 PCD 点云进行处理生成 2D 栅格地图 PGM&#xff0c;而后将该 PGM 地图充分运用到无人系统路径规划之中&#xff0c;使得无人机能够依据此规划合理避开飞行路线上可能出现的障碍物。&#xff08;解决如何使用PGM的问题&#xff09; Hybrid A*算法 参考博客…

Node.js:内置模块

Node.js&#xff1a;内置模块 Node.jsfs模块读取文件写入文件__dirname path模块路径拼接文件名解析 http模块创建服务 Node.js 传统的JavaScript是运行在浏览器的&#xff0c;浏览器就是其运行环境。 浏览器提供了JavaScript的API&#xff0c;以及解析JavaScript的解析引擎&a…

「漏洞复现」浪潮海岳 HCM Cloud download 任意文件读取漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

接雨水

接雨水 ​ 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,…

String的长度有限,而我对你的思念却无限延伸

公主请阅 1. 为什么学习string类&#xff1f;2. string类的常用接口2.1 string类对象的常见构造2.1.1 string 2.2 operator[]2.3 迭代器2.4 auto自动推导数据类型2.5 范围for2.6 迭代器第二层2.7 size和length获取字符串的长度2.8 max_size 获取这个字符串能设置的最大长度2.9 …

Docker Compose一键部署Spring Boot + Vue项目

目录 前提条件 概述 Compose简介 Compose文件 Compose环境 Compose命令 帮助命令 关键命令 Compose部署项目 初始化环境 查看代码文件 sql数据准备 nginx配置文件准备 创建 compose.yaml 一键启动compose多个容器 浏览器访问虚拟机ip:80(可省略默认的80端口) …