【Vue全家桶】细说slot

【Vue全家桶】细说slot

文章目录

  • 【Vue全家桶】细说slot
  • 前言
  • 一、认识插槽Slot
    • 1.1 插槽的基本使用
  • 二、插槽的使用
    • 2.1 默认内容
    • 2.2 剧名插槽
    • 2.3 作用域插槽

前言

我们已经了解到组件能够接收任意类型的 JavaScript 值作为 props,但组件要如何接收模板内容呢?在某些场景中,我们可能想要为子组件传递一些模板片段,让子组件在它们的组件中渲染这些片段。

一、认识插槽Slot

在开发中,我们会经常封装一个个可复用的组件

  • 我们会通过props传递给组件一些数据,让组件来进行展示;
  • 但是为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定的div、span等等这些元素;
  • 比如某种情况下我们使用组件,希望组件显示的是一个按钮,某种情况下我们使用组件希望显示的是一张图片;
  • 我们应该让使用者可以决定某一块区域到底存放什么内容和元素;

1.1 插槽的基本使用

这个时候我们就可以来定义插槽slot: 、

  • 插槽的使用过程其实是抽取共性、预留不同
  • 我们会将共同的元素、内容依然在组件内进行封装
  • 同时会将不同的元素使用slot作为占位,让外部决定到底显示什么样的元素;

举例来说,这里有一个 <FancyButton> 组件,可以像这样使用:

<FancyButton>
  Click me! <!-- 插槽内容 -->
</FancyButton>

<FancyButton> 的模板是这样的:

<button class="fancy-btn">
  <slot></slot> <!-- 插槽出口 -->
</button>

<slot> 元素是一个插槽出口 (slot outlet),标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。

在这里插入图片描述

最终渲染出的 DOM 是这样:

<button class="fancy-btn">Click me!</button>

通过使用插槽,<FancyButton> 组件更加灵活和具有可复用性。现在组件可以用在不同的地方渲染各异的内容,但同时还保证都具有相同的样式。

二、插槽的使用

2.1 默认内容

有时候我们希望在使用插槽时,如果没有插入对应的内容,那么我们需要显示一个默认的内容

  • 当然这个默认的内容只会在没有提供插入的内容时,才会显示;

在外部没有提供任何内容的情况下,可以为插槽指定默认内容。比如有这样一个 <ShowMessage> 组件:

<template>
  <div>
    <h2>content 开始</h2>
    <slot></slot>
    <h2>content 结尾</h2>
  </div>
</template>

如果我们想在父组件没有提供任何插槽内容时渲染默认内容,只需要将默认内容写在 <slot> 标签之间来作为默认内容:

<template>
  <div>
    <h2>slot 开始</h2>
    <slot>
      <h2>默认显示的内容</h2>
    </slot>
    <h2>slot 结尾</h2>
  </div>
</template>

现在,当我们在父组件中使用 <ShowMessage> 且没有提供任何插槽内容时:

<ShowMessage />

将会把默认内容渲染:

在这里插入图片描述

但如果我们提供了插槽内容:

<show-message>
    <button>登录</button>
</show-message>

那么被显式提供的内容会取代默认内容:

在这里插入图片描述

2.2 剧名插槽

当一个组件中含有多个插槽,我们插入多个内容时

  • 会发现默认情况下每个插槽都会获取到我们插入的内容来显示
<template>
  <div class="nav-bar">
    <div class="left">
      <slot></slot>
    </div>
    <div class="center">
      <slot></slot>
    </div>
    <div class="right">
      <slot></slot>
    </div>
  </div>
</template>
<template>
  <div>
    <nav-bar>
      <button>左边元素</button>
      <h2>中间标题</h2>
      <button>右边元素</button>
    </nav-bar>
  </div>
</template>

在这里插入图片描述

对于这种场景,<slot> 元素可以有一个特殊的 attribute name,用来给各个插槽分配唯一的 ID,以确定每一处要渲染的内容:

<div class="nav-bar">
    <div class="left">
        <slot name="left"></slot>
    </div>
    <div class="center">
        <slot name="center"></slot>
    </div>
    <div class="right">
        <slot name="right"></slot>
    </div>
</div>

这类带 name 的插槽被称为具名插槽 (named slots)。没有提供 name<slot> 出口会隐式地命名为“default”。

在父组件中使用时,我们需要一种方式将多个插槽内容传入到各自目标插槽的出口。此时就需要用到具名插槽了:

要为具名插槽传入内容,我们需要使用一个含 v-slot 指令的 <template> 元素,并将目标插槽的名字传给该指令:

<nav-bar>
    <template v-slot:left>
		<button>左边元素</button>
    </template>
    <template v-slot:center>
		<h2>中间标题</h2>
    </template>
    <template v-slot:right>
		<button>右边元素</button>
    </template>
</nav-bar>

在这里插入图片描述

补充

  • 我们可以通过 v-slot:[dynamicSlotName]方式动态绑定一个名称;
  • v-slot缩写:(v-slot:) 替换为字符 #;

2.3 作用域插槽

在Vue中有渲染作用域的概念

  • 父级模板里的所有内容都是在父级作用域中编译的;
  • 子模板里的所有内容都是在子作用域中编译的;
  • 插槽的内容无法访问到子组件的状态

然而在某些场景下插槽的内容可能想要同时使用父组件域内和子组件域内的数据。要做到这一点,我们需要一种方法来让子组件在渲染时将一部分数据提供给插槽。

  • 我们可以像对组件传递 props 那样,向一个插槽的出口上传递 attributes:

  • 当需要接收插槽 props 时,默认插槽和具名插槽的使用方式有一些小区别。

    • 默认插槽接受 props,通过子组件标签上的 v-slot 指令,直接接收到了一个插槽 props 对象:
    <!-- <MyComponent> 的模板 -->
    <div>
      <slot :text="greetingMessage" :count="1"></slot>
    </div>
    
    <MyComponent v-slot="slotProps">
      {{ slotProps.text }} {{ slotProps.count }}
    </MyComponent>
    
    
    • 具名作用域插槽的工作方式也是类似的,插槽 props 可以作为 v-slot 指令的值被访问到:v-slot:name="slotProps"。当使用缩写时是这样:
    <MyComponent>
      <template #header="headerProps">
        {{ headerProps }}
      </template>
    </MyComponent>
    
    • 向具名插槽中传入 props:
    <slot name="header" message="hello"></slot>
    

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

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

相关文章

【翻译】使用Go生成一个随机字符串(密码)

来源&#xff1a; Generate a random string (password) YourBasic Go https://yourbasic.org/golang/generate-random-string/ Random string 随机字符串 This code generates a random string of numbers and characters from the Swedish alphabet (which includes the non…

Linux内核查询

使用uname命令查找Linux内核 uname是用于获取系统信息的Linux命令。您也可以使用它来确定您使用的是32位还是64位系统。 打开一个终端并使用以下命令&#xff1a; [linuxmilinux:~/www.xxx.com]$ uname -r 输出将类似于以下内容&#xff1a; 5.3.0-28-generic 这意味着您正在…

【CocosCreator入门】CocosCreator组件学习 | Sprite(精灵)组件

Cocos Creator 是一款流行的游戏开发引擎&#xff0c;具有丰富的组件和工具&#xff0c;其中 Sprite 组件是最常用的之一。Sprite 组件用于渲染 2D 图像&#xff0c;并提供了许多可配置的选项&#xff0c;如图像纹理、尺寸、位置、旋转等。在本文中&#xff0c;我们将深入探讨 …

如何成为一个优秀的产品经理?

通过本文您可以清楚地了解产品经理的角色和职责&#xff0c;教您如何摇身一变成为优秀的产品经理的技巧等。 一、什么是产品经理&#xff1f; 产品经理主要的职责在于确定客户需求、将产品或功能实现商业目标的最大化、将产品打造成最终成功的样子&#xff0c;并召集团队将这…

python接口自动化(二)--什么是接口测试、为什么要做接口测试(详解)

什么是接口测试 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。  一般来说&#xff0c;测试接…

【Qt】Qt单元测试详解(一):通过QtCreator创建测试工程

1、简述 Qt程序支持多种测试框架,其中QtCreator可以协助创建4种测试框架,分别是: Boost的测试框架——Boost.Test Google测试框架——GTest Qt测试框架——QTest Qt Quick测试框架——QtQuickTest其他框架需要自行创建:Catch2、CTest 2、QtCreator创建测试工程 2.1 创建…

jenkins+sonarqube+自动部署服务

一、jenkins 配置Pipeline 二、新建共享库执行脚本 共享库可以是一个普通的gitlab项目&#xff0c;目录结构如下 三、添加到共享库 Jenkins Dashboard–>系统管理–>系统配置–>Global Pipeline Libraries Name: 共享库名称&#xff0c;自定义即可&#xff1b; Defa…

从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。随着小卫星星座的普及&#xff0c;对地观测已具备多次以上的全球覆盖…

输出数组的长度-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第3章-课后作业)

【案例3-5】输出数组的长度 一、案例描述 考核知识点 length()方法 练习目标 掌握length()方法获取数组长度。掌握数组的遍历。 需求分析 数组中保存五个学生的数学成绩&#xff0c;遍历数组分别获取每一个学生的数学成绩分数&#xff0c;用length()函数获取数组的长度。 案…

帝国CMS7.2/7.5火车头配置说明以及使用教程

一淘模板 56admin.com给大家写一个帝国cms火车头采集器配置的教程&#xff0c;由于录视频太麻烦&#xff0c;所以直接打字上图了&#xff0c;希望能帮助到小伙伴&#xff01; 火车头简要来讲分为 3 个部分的配置&#xff1a;1、发布地址配置&#xff1b;2、文件保存地址与图片…

数据结构|AOE网活动的最早、最迟发生时间及关键路径问题

一些知识点&#xff1a; 整个活动的完成时间是AOE图中从始点到终点的最长路径的长度&#xff0c;这条路径称为关键路径。关键路径上的活动称作关键活动。 注意&#xff1a;关键路径不一定只有一条。 1.最早发生时间&#xff1a;从前往后&#xff0c;前驱结点到当前结点所需时…

SpringBoot使用详解

概念 Spring Boot的启动器实际上就是一个依赖。这个依赖中包含了整个这个技术的相关jar包&#xff0c;还包含了这个技术的自动配置&#xff0c;以前绝大多数XML配置都不需要配置了。 如果是Spring自己封装的启动器的artifact id名字满足&#xff1a;spring-boot-starter-xxxx&…

Java分布式锁面试题

1.为什么需要分布式锁? public synchronized void test() {System.out.println("获取到锁"); } public void test2() {synchronized (Test.class) {System.out.println("获取到锁");} }假设我们把上述代码部署到多台服务器上&#xff0c;这个互斥锁还能生…

BPI-R3开发板 - atf编译

一. 获取源码 https://github.com/mtk-openwrt/arm-trusted-firmware 二. 编译步骤 和编译uboot一样&#xff0c;编译环境为ubuntu 18.04。交叉编译工具链我用的是openwrt编译生成的工具链&#xff0c;并设置到环境变量&#xff0c;如下&#xff1a; export PATH$PATH:/root/mt…

【大屏设计方案】

大屏设计方案一、非等比放大(填充满整个屏幕)目的屏幕比例大小和设计稿的差的不多目的屏幕比例大小和设计稿的差很多二、等比放大&#xff08;比如16&#xff1a;9&#xff09;解决方案之后就可以用rem了&#xff0c;有两种便利的方式&#xff1a;也可以用media 根据不同的屏幕…

膳食真菌在癌症免疫治疗中的作用: 从肠道微生物群的角度

谷禾健康 癌症是一种恶性肿瘤&#xff0c;它可以发生在人体的任何部位&#xff0c;包括肺、乳房、结肠、胃、肝、宫颈等。根据世界卫生组织的数据&#xff0c;全球每年有超过1800万人被诊断出患有癌症&#xff0c;其中约有1000万人死于癌症。癌症已成为全球范围内的主要健康问题…

@LoadBalanced注解原理

1.概述 使用注解就像是在代码中加入了一段魔法&#xff0c;让我们轻而易举的就实现了至关重要的功能。 就像LoadBalanced一样&#xff0c;将该注解使用在RestTemplate的Bean上&#xff0c;就可以实现负载均衡&#xff0c;就像下面这段代码&#xff1a; Configuration public…

新手UI设计师必读:火爆海外设计圈的设计资源!

Hello&#xff0c;各位好&#xff01; 作为一名新手UI设计师&#xff0c;你是否无法完全搞清楚某些UI设计的基本原则和概念&#xff1f;你是否为使用哪款设计软件来开启你的设计之路而困扰&#xff1f;你是否想要在线学习设计排版、色彩搭配、形状和线条设计&#xff1f; 今天这…

rabbitMQ的详细介绍

1.概述 RabbitMQ是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点&#xff0c;当你要发送一个包裹时&#xff0c;你把你的包裹放到快递站&#xff0c;快递员最终会把你的快递送到收件人那里&#xff0c;按照这种逻辑RabbitMQ是一个快递站&#xff0c;一个快递员…

实验记录项目

1. 关于语谱图的通道的均值与方差 2023年 03月 27日 星期一 10:10:22 CST 使用tqwt 对每一份音频进行分解: 每份音频得到三个分量, cA分量: 近似分量,用于表征低频部分; cD分量: 高频分量,  res 剩余分量: 1.1 问题: 对每个分量使用如下变换,  使用Mel,  Shar…