vue3 插槽使用详解

news2024/12/23 13:54:19

目录

      • 1 前言
      • 2 插槽的使用
        • 2.1 基本使用
        • 2.2 具名插槽
        • 2.3 动态插槽名
        • 2.4 插槽传值
      • 3 总结

1 前言

Vue 实现了一套内容分发的 API,将 <slot> 元素作为承载分发内容的出口,使用插槽使得vue组件的设计更加灵活。

在vue版本更迭中,尽管插槽的使用语法有部分变化,插槽的核心用法并未改变,鉴于vue2将在2023年第不再维护,以下我们将围绕vue3对插槽的具体使用方法进行展开。

2 插槽的使用

2.1 基本使用

当子组件中使用slot声明一个插槽出口API后,父组件在使用子组件时,可以选择将父组件内容渲染到子组件插槽部分,也可以选择不做渲染。

若父组件没有提供插槽内容,则不会渲染,子组件会使用其本身的默认内容进行页面渲染。我们来看如下示例:

子组件:SlotsComponent.vue

<template>
  <div class="red-text">
    <slot>
      子组件插槽
    </slot>
  </div>
</template>
<style scoped>
.red-text {
  color: red;
}
</style>

父组件:index.vue

<template>
  <div>
    <label>父组件</label>
    <SlotComponent></SlotComponent>
  </div>
</template>
<script>
import SlotComponent from "./component/SlotsComponent";
export default {
  components: {
    SlotComponent
  }
};
</script>

渲染结果如下:

在这里插入图片描述

我们可以看到这个时候页面渲染的是子组件默认的内容。

再看父组件提供插槽内容的情况,子组件代码不变,父组件代码如下:

<template>
  <div>
    <label>父组件</label>
    <SlotComponent>
      父组件使用子组件插槽
    </SlotComponent>
  </div>
</template>
<script>
import SlotComponent from "./component/SlotsComponent";
export default {
  components: {
    SlotComponent
  }
};
</script>

渲染结果如下:

在这里插入图片描述

我们可以看到子组件插槽部分被父组件使用的插槽内容替换。以上是插槽的基本使用。

2.2 具名插槽

具名插槽,顾名思义,就是具有名称的插槽,在项目日常开发规范中,一搬公司都会要求使用具名插槽,以变后续组件的扩展和增强代码的可读性。

其次,若我们需要在子组件中声明多个插槽出口,也必须使用具名插槽,用于区分父组件的使用,具名插槽就是利用slot的name属性给插槽命名,父组件中使用v-slot:slotName来使用对应的插槽。

以下我们来看一下具名插槽的使用:

子组件:SlotsComponent.vue

<template>
  <div class="red-text">
    <header>
      <slot name="header">
        <!-- 页面头部 -->
      </slot>
    </header>
    <main>
      <slot name="main">
        <!-- 页面内容 -->
      </slot>
    </main>
    <footer>
      <slot name="footer">
        <!-- 页面底部 -->
      </slot>
    </footer>
  </div>
</template>
<script>
export default {};
</script>
<style scoped>
.red-text {
  color: red;
}
</style>

父组件:index.vue

<template>
  <div>
    <label>父组件</label>
    <SlotComponent>
      <template v-slot:header>
        我是头
      </template>
      <template v-slot:footer>
        我是底
      </template>
    </SlotComponent>
  </div>
</template>
<script>
import SlotComponent from "./component/SlotsComponent";
export default {
  components: {
    SlotComponent
  }
};
</script>

渲染结果如下:

在这里插入图片描述

我们可以看到渲染结果如上。通过该渲染结果,我们也知道若子组件声明了具名插槽,但是父组件使用。则不会在页面渲染(除非有默认值)。出自之外还有以下几个注意点:

  1. 若存在多个插槽,部分有名称,部分无名称,则无名插槽使用方法同2.1;
  2. vue3语法有所改变,使用具名插槽必须使用<template v-slot:slotname>,和部分vue低版本用法不同。

2.3 动态插槽名

在具名插槽的基础上,动态控制插槽的名称,成为动态插槽名,使用动态插槽,我们可以将父组件的内容动态渲染到到子组件插槽接口中。

使用方法如下:

父组件:

<template>
  <div>
    <label>父组件</label>
    <SlotComponent>
      <template v-slot:[dynamicSlotName]>
        我是动态插槽
      </template>
      <template v-slot:footer>
        我是底
      </template>
    </SlotComponent>
  </div>
</template>
<script>
import SlotComponent from "./component/SlotsComponent";
export default {
  components: {
    SlotComponent
  },
  data() {
    return {
      dynamicSlotName: "header"
    };
  }
};
</script>

渲染结果如下:

在这里插入图片描述

2.4 插槽传值

通常情况下,父子间插槽内容只能直接访问父组件的属性,当我们父组件需要使用子组件插槽属性时,我们可以用到插槽传值。

示例如下:

子组件:SlotsComponent.vue

<template>
  <div class="red-text">
    <header>
      <slot :title="headerTitle" name="header">
        <!-- 页面头部 -->
      </slot>
    </header>
    <main>
      <slot name="main">
        <!-- 页面内容 -->
      </slot>
    </main>
    <footer>
      <slot name="footer">
        <!-- 页面底部 -->
      </slot>
    </footer>
  </div>
</template>
<script>
export default {
  data() {
    return {
      headerTitle: "我是子组件slot变量"
    };
  }
};
</script>
<style scoped>
.red-text {
  color: red;
}
</style>


父组件:index.vue

<template>
  <div>
    <label>父组件</label>
    <SlotComponent>
      <template v-slot:header="slotProps">
        {{ slotProps.title }}
      </template>
      <template v-slot:footer>
        我是底
      </template>
    </SlotComponent>
  </div>
</template>
<script>
import SlotComponent from "./component/SlotsComponent";
export default {
  components: {
    SlotComponent
  },
  data() {
    return {
      dynamicSlotName: "header"
    };
  }
};
</script>

渲染结果如下:

在这里插入图片描述

其中,以上代码使用插槽传值,v-slot:header="slotProps"slotProps可以读取到名字为header插槽上所有的属性,比如我们在子组件slot中声明的title属性。同样利用这个方法,可以传递多个属性到父组件的插槽内容中。

3 总结

以上内容为了让读者更好理解插槽,降低学习成本,从事至终我们都是用同一个示例进行演示,以上代码为插槽的基本知识,从2.1到2.4为循序渐进过程。

天下难事,必作于易,天下大事,必作于细。从以上插槽的使用方法中,希望大家能理解并掌握插槽基本知识,这样以来,就可以进行融会贯通,应用于复杂的代码环境当中。同时若有写的不对的地方或者有什么建议,欢迎大家一起学习探讨。

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

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

相关文章

常用的设计模式之一(创建型模式)

设计模式可分为三大类&#xff1a; 创建型模式 (Creational Patterns)结构性模式 (Structural Patterns)行为型模式 (Behavioral Patterns) 模式描述包括创建型模式工厂模式&#xff08;Factory Pattern&#xff09; 抽象工厂模式&#xff08;Abstract Factory Pattern&#…

并发编程——可见性与有序性

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;耶瞳空间 JMM即Java Memory Model&#xff0c;它定义了主存、工作内存抽象概念&#xff0c;底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等。JMM体现在以下几个方面&#xff1a; 原子性&…

Web API

DOM API 1、选中页面元素 let elem document.querySelector(CSS选择器); console.log(elem); console.dir(elem); 2、事件 鼠标点击事件 onclick 鼠标移动事件 onmousemove 等等 事件源 .box&#xff0c;事件类型 onlick&#xff0c;事件处理方式 alert(hello) let d…

[Mybatis1]介绍与快速入门

文章目录 Mybatis概述 持久层 框架 Mybatis与JDBC对比 JDBC代码的缺陷 Mybatis简化JDBC Mybatis快速入门案例 整体案例项目结构 1.创建user表&#xff0c;添加数据 2.创建Maven项目&#xff0c;导入坐标 3.编写Mybatis核心配置文件 4.编写数据库返回对象的实体类 5. 编写S…

QML Button详解

1.Button简介 Button表示用户可以按下或单击的按钮控件。按钮通常用于执行一个动作&#xff0c;或回答一个问题。典型的按钮有确定、应用、取消、关闭、是、否和帮助。 Button继承自AbstractButton&#xff0c;提供了以下几种信号。 void canceled() //当按…

Python笔记 -- 列表

文章目录1、列表简介2、修改、添加、删除元素2.1、添加2.2、删除3、排序、倒序4、遍历列表5、创建数值列表6、列表切片7、列表复制8、元组1、列表简介 在Python中用方括号[]表示列表&#xff0c;用逗号隔开表示其元素 通过索引访问列表 names [aa,bb,cc,dd]print(names[0]) …

游戏项目中的程序化生成(PCG):算法之外的问题与问题

本篇讨论的是什么 从概念上讲&#xff0c;PCG&#xff08;程序化生成&#xff09;的含义很广&#xff1a;任何通过规则计算得到的内容&#xff0c;都可算作是PCG。但在很多游戏项目的资料&#xff0c;包括本篇&#xff0c;讨论PCG时特指是&#xff1a;用一些算法/工具(特别是H…

C语言-基础了解-13-C enum枚举

C enum枚举 一、C枚举 枚举是 C 语言中的一种基本数据类型&#xff0c;用于定义一组具有离散值的常量。&#xff0c;它可以让数据更简洁&#xff0c;更易读。 枚举类型通常用于为程序中的一组相关的常量取名字&#xff0c;以便于程序的可读性和维护性。 定义一个枚举类型&a…

3.2 LED闪烁流水灯蜂鸣器

LED闪烁1.1 电路连接示意图LED采用低电平点亮的方式&#xff0c;利用ST-Link的3.3V进行供电。1.2程序设计1.21知识储备GPIO配置步骤步骤&#xff1a;1. 第⼀步&#xff0c;使⽤RCC开启GPIO的时钟2. 第⼆步&#xff0c;使⽤GPIO_Init()函数初始化GPIO3. 第三步&#xff0c;使⽤输…

JavaWeb--会话技术

会话技术1 会话跟踪技术的概述2 Cookie2.1 Cookie的基本使用2.2 Cookie的原理分析2.3 Cookie的使用细节2.3.1 Cookie的存活时间2.3.2 Cookie存储中文3 Session3.1 Session的基本使用3.2 Session的原理分析3.3 Session的使用细节3.3.1 Session钝化与活化3.3.2 Session销毁目标 理…

java坦克大战(1.0)

坦克大战 后面开始学习怎么使用java制造一个坦克大战游戏 但是不是直接开始做&#xff0c;而是随着这个游戏程序的制造&#xff0c;一边学习新知识融入到游戏中。包括多线程&#xff0c;反射&#xff0c;IO流… Java坐标体系 在几乎所有的坐标中都有一个x轴和y轴&#xff0c…

大数据项目实战之数据仓库:用户行为采集平台——第1章 数据仓库概念

第1章 数据仓库概念 数据仓库&#xff08;Data Warehouse&#xff09;&#xff0c;是为企业制定决策&#xff0c;提供数据支持的。可以帮助企业改进业务流程、提高产品质量等。 数据仓库的输入数据通常包括&#xff1a;业务数据、用户行为数据和爬虫数据等 业务数据&#xf…

Java - 对象的比较

一、问题提出 前面讲了优先级队列&#xff0c;优先级队列在插入元素时有个要求&#xff1a;插入的元素不能是null或者元素之间必须要能够进行比较&#xff0c;为了简单起见&#xff0c;我们只是插入了Integer类型&#xff0c; 那优先级队列中能否插入自定义类型对象呢&#xf…

深入理解JDK动态代理原理,使用javassist动手写一个动态代理框架

文章目录一、动手实现一个动态代理框架1、初识javassist2、使用javassist实现一个动态代理框架二、JDK动态代理1、编码实现2、基本原理&#xff08;1&#xff09;getProxyClass0方法&#xff08;2&#xff09;总结写在后面一、动手实现一个动态代理框架 1、初识javassist Jav…

Dijkstra算法的入门与应用

目录 一、前言 二、Dijkstra算法 1、Dijkstra 算法简介 2、算法思想&#xff1a;多米诺骨牌 3、算法实现 4、例子 三、例题 1、蓝桥王国&#xff08;lanqiaoOJ题号1122&#xff09; 一、前言 本文主要讲了Dijkstra算法的概念、实现与一道模板例题。 二、Dijkstra算法…

RSTP基础要点(上)

RSTP基础RSTP引入背景STP所存在的问题RSTP对于STP的改进端口角色重新划分端口状态重新划分快速收敛机制&#xff1a;PA机制端口快速切换边缘端口的引入RSTP引入背景 STP协议虽然能够解决环路问题&#xff0c;但是由于网络拓扑收敛较慢&#xff0c;影响了用户通信质量&#xff…

分布式对象存储

参考《分布式对象存储----原理、架构以及Go语言实现》&#xff08;作者&#xff1a;胡世杰&#xff09; 对象存储简介 数据的管理方式 以对象的方式管理数据&#xff0c;一个对象包括&#xff1a;对象的数据、对象的元数据、对象的全局唯一标识符 访问数据的方式 可扩展的分…

useCallback、useMemo、React.memo

1、React.memo React.memo 是 React 中用于函数组件优化的高阶组件&#xff0c;可以在一定程度上减少组件的重渲染&#xff0c;提升应用性能。React.memo 的实现原理是对比组件的前后两次渲染传入的 props 是否相等&#xff0c;如果相等则不会触发重新渲染&#xff0c;否则会触…

使用 Nacos 搭建一个简单的微服务项目

Nacos Nacos 是阿里巴巴推出来的一个新开源项目&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 准备Nacos 将 nacos 安装成功之后&#xff0c;进入nacos的bin 目录下&#xff0c;通过命令sh startup.sh -m standalone启动nacos&#xff0c;然后…

ChatGPT概述:从模型训练到基本应用的介绍

ChatGPT概述&#xff1a;从模型训练到基本应用的介绍 目录 本文是对ChatGPT的由来、训练过程以及实际落地场景的解释&#xff0c;主要内容包括如下三个方面&#xff1a; 1、ChatGPT是什么 2、ChatGPT的原理 3、ChatGPT的思考 4、ChatGPT的应用 ChatGPT是什么 ChatGPT可能是近…