vue3中的插槽

news2024/11/26 20:32:28

目录

  • 什么是插槽
  • 插槽的类型
    • 默认插槽
    • 具名插槽
    • 作用域插槽
  • 插槽的默认内容
  • 动态组件中使用插槽
  • 插槽的组合使用
  • 插槽的高级用法
    • 插槽复用
    • 将动态组件作为插槽
  • 插槽的优先级规则

什么是插槽

插槽是组件中用来承载内容的一种机制,可以让组件在运行时接受来自其它组件的任意内容。可以将它理解为是在Vue组件中定义的占位符,用于指定在父组件中传递给子组件的内容的位置。它可以根据需要在父组件中动态地插入不同的内容,同时也可以接受子组件中传递下来的数据。
创建插槽
在vue的组件中,使用<slot>标签来定义插槽,我们先在components文件夹新建一个Product.vue组件,在Product组件中用<slot>插槽占位,代码如下

<template>
  <div>
    <h2>这是插槽之前的内容</h2>
      <slot></slot>
    <h3>这是插槽之后的内容</h3>
  </div>
</template>
<script setup>
</script>
<style scoped>
</style>

然后在APP.vue中引入组件Product.vue,并在<Product></Product>标签中间用div填写要在Product.vue的插槽中显示的内容即可

<template>
  <div>
    <Product>
      <div>这里是从APP.vue填入Product组件slot中的内容</div>
    </Product>
  </div>
</template>
<script setup>
import Product from './components/Product.vue'
</script>

<style scoped>
</style>

运行,刷新浏览器,效果如下
在这里插入图片描述

插槽的类型

vue中提供的插槽有三种类型:默认插槽、具名插槽和作用域插槽。

默认插槽

默认插槽是最简单和常见的一种插槽。它允许组件接收任何未命名的内容,并将其作为组件的子元素插入。默认插槽通常在组件标签内部添加一个 slot 标签来声明,比如我们定义一个MyComponent.vue组件,其代码如下:

<template>
  <div>
    <slot></slot>
  </div>
</template>

当我们将组件在App.vue渲染时,任意内容都可以通过这个默认插槽插入组件中,如下所示:

<MyComponent>
  <h1>hello world</h1>
</MyComponent>

这里我们在App.vue中调用 MyComponent组件时,在 MyComponent标签内部添加了一个h1标签,里面填写了一段内容。这段内容将被注入到MyComponent.vue组件的 <slot></slot> 标签内。

具名插槽

具名插槽顾名思义就是带有名字的插槽,它允许开发者有选择地将内容插入到组件的某个具名插槽中。声明具名插槽非常简单,我们只需要在slot标签里加入一个特殊的属性:name,用来给各个插槽分配唯一的 ID,以确定每一处要渲染的内容。具名插槽像下面这样声明:

<template>
  <div>
    <slot name="header"></slot>
    <slot></slot>
  </div>
</template>

在上面的代码中,我声明了两个插槽:一个具名为 “header” 的插槽,和一个默认插槽。具名插槽可以像下面这样使用:
在父组件中使用 <MyComponent> 时,要为具名插槽传入内容,我们需要使用一个含 v-slot 指令的<template> 元素,并将目标插槽的名字传给该指令: <template v-slot:header>
v-slot 可以简写 为#,因此 <template v-slot:header> 可以简写为 <template #header>。其意思就是“将这部分模板片段传入子组件的 header 插槽中”

<MyComponent>
  <template #header>
    <h1>custom header</h1>
  </template>
  <p>main content</p>
</MyComponent>

作用域插槽

作用域插槽可以理解为"带数据的插槽",在某些场景下插槽的内容可能想要同时使用父组件域内和子组件域内的数据,这时就需要用到作用域插槽了。作用域插槽可以像下面这样声明:

<template>
  <div>
    <slot name="header" :text="headerText"></slot>
  </div>
</template>

在上面代码中,在 MyComponent 组件中声明了一个具名插槽 #header,并向它传递了一个名为 text 的属性。

我们需要在父组件中使用 v-slot 指令来将数据传递到作用域插槽中,如下所示:

<template>
  <MyComponent>
    <template #header="slotProps">
      <h1>{{slotProps.text}}</h1>
    </template>
  </MyComponent>
</template>

在父组件中,我们使用 v-slot 指令,将数据传递到了 #header 插槽中。

插槽的默认内容

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

<button type="submit">
  <slot></slot>
</button>

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

<button type="submit">
  <slot>
    提交 <!-- 默认内容 -->
  </slot>
</button>

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

<SubmitButton />

“提交”将会被作为默认内容渲染:
但如果我们在父组件中提供了插槽内容:
保存
那么被显式提供的内容会取代默认内容

动态组件中使用插槽

在动态组件中,插槽所在的父组件需要使用component标签包裹,指定需要动态变化的组件,同时使用v-bind指令将组件需要的参数动态绑定到一个JS对象上传递给动态组件。

<template>
  <div>
    <component :is="currentComponent" v-bind="data">
      <slot v-bind:name="slotName"></slot>
    </component>
  </div>
</template>

插槽的组合使用

在一个组件中,可以同时使用多个插槽,我们可以使用<template>标签来将多个插槽组合起来,同时,可以使用包含v-if和v-for指令的<template>标签来进行更加复杂的插槽设计。

<template>
  <div>
    <template #header>
      <h1>这是header插槽的内容</h1>
    </template>
    <template #main>
      <h1 v-if="showMainTitle">这是main插槽的标题</h1>
      <p v-for="item in list" :key="item.id">{{ item.name }}</p>
    </template>
    <template #footer>
      <button @click="onClickFooterBtn">点击这个按钮会触发footer插槽的事件</button>
    </template>
  </div>
</template>

插槽的高级用法

插槽复用

在实际开发中,可能会出现多个组件中复用同一个插槽的情况,这时,可以将插槽定义在一个独立的组件中,然后在需要使用时进行引用。下面代码演示了如何将插槽定义在一个独立的组件中,然后分别在App.vue、ParentComponent.vue和AnotherComponent.vue三个组件中进行引用的示例,通过如下步骤实现:

1、首先定义一个SlotComponent.vue组件

<template>
  <div>
    <slot></slot>
  </div>
</template>

2、然后在需要调用插槽的一个父组件ParentComponent.vue中引入并调用插槽

<template>
  <div>
    <slot-component>
      <h4>这里是在ParentComponent组件中引入SlotComponent.vue插槽的内容</h4>
    </slot-component> 
  </div>
</template>
<script setup>
import SlotComponent from './SlotComponent.vue';
</script>
<style scoped>
</style>

3、在需要调用该插槽的另一个父组件AnotherComponent.vue引入并调用插槽

<template>
  <div>
    <slot-component>
      <h4>这里是在AnotherComponent组件中引入SlotComponent.vue插槽的内容</h4>
    </slot-component> 
  </div>
</template>
<script setup>
import SlotComponent from './SlotComponent.vue';
</script>
<style scoped>
</style>

4、在App.vue中引入上面的ParentComponent.vue、AnotherComponent.vue和SlotComponent.vue组件,代码如下

<template>
  <div>
    <AnotherComponent></AnotherComponent>
    <h6>---------------------------------</h6>
    <ParentComponent></ParentComponent>
    <h6>---------------------------------</h6>
    <div>
      <SlotComponent>
        <h4>这里是在App组件中引入SlotComponent.vue插槽的内容</h4>
      </SlotComponent>
    </div>    
  </div>
</template>
<script setup>
import AnotherComponent from './components/AnotherComponent.vue';
import ParentComponent from './components/ParentComponent.vue'; 
import SlotComponent from './components/SlotComponent.vue';
</script>
<style scoped>
</style>

运行程序,刷新浏览器,可以看到效果如下
在这里插入图片描述

将动态组件作为插槽

在实际开发中,我们也可以将动态组件作为插槽的内容进行渲染。示例代码如下:

定义一个需要动态显示的组件DynamicComponent.vue,

<template>
  <h4>我是动态组件,我也可以放入SlotComponent组件定义的插槽中</h4>
</template>
<script setup>
</script>
<style scoped>
</style>

在App.vue中,将动态组件传递到 上面定义的SlotComponent.vue 中进行渲染。

 <SlotComponent>
      <template #default>
        <component v-bind:is="DynamicComponent"></component>
      </template>
</SlotComponent> 

运行,刷新浏览器, 可以看到内容已经渲染成功
在这里插入图片描述

插槽的优先级规则

1、父组件中指定默认插槽内容,在子组件中没有指定插槽名,父组件默认插入到默认插槽中。
父组件代码

<SlotComponent>
      在子组件中没有指定插槽名,父组件默认插入到默认插槽中。
 </SlotComponent>

子组件SlotComponent中的代码

<template>
   <div>
    <slot></slot>
    <h4>***********************************</h4>
    <slot name="header">
      这里是名称为header插槽的默认内容
    </slot>
  </div>
</template>
<script setup>
</script>
<style scoped>
</style>

运行效果如下
在这里插入图片描述
2、如果在父组件中指定了插槽名,在子组件中有相同名称的插槽,父组件插槽内容会覆盖子组件插槽内容。

下面代码在父组件指定了名称为“header”的插槽内容,在子组件中有相同名称的插槽,父组件插槽内容会覆盖子组件插槽内容。

父组件代码

 <SlotComponent>
      如果在父组件中指定了插槽名,在子组件中有相同名称的插槽,父组件插槽内容会覆盖子组件插槽内容。
      <template v-slot:header>
        父组件指定了名称为“header”的插槽内容,在子组件中有相同名称的插槽,父组件插槽内容会覆盖子组件插槽内容。
      </template>
    </SlotComponent>

运行效果
在这里插入图片描述
3、在父组件中使用了 v-slot 指令,子组件中没有指定名称,父组件的未命名插槽会分配到子组件的默认插槽中。

<SlotComponent>   
  <template v-slot>
   在父组件中使用了 v-slot 指令,子组件中没有指定名称,父组件的未命名插槽会分配到子组件的名为“default”的插槽中。
  </template> 
 <template v-slot:header>
    这里是header插槽的内容
  </template>
</SlotComponent>

运行代码,效果如下
在这里插入图片描述
4、在父组件和子组件中都指定了名称,父组件中指定名称的插槽内容会覆盖子组件中相同名称的插槽内容。

ok,关于vue3中插槽的使用方法,就介绍到这里了,喜欢的小伙伴点赞关注加收藏哦!

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

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

相关文章

【后端面经-数据库】MySQL的存储引擎简介

【后端面经-数据库】MySQL的存储引擎简介 MySQL的存储引擎0. 存储引擎的查看和修改1. MyISAM2. InnoDB3. MEMORY4. MERGE5. 总结6. 参考博客 MySQL的存储引擎 mysql主要有四类存储引擎&#xff0c;目前主要使用InnoDB作为存储引擎。 0. 存储引擎的查看和修改 查看当前数据库…

Oracle子查询改写的几种方式

子查询定义 子查询是嵌套在另一个语句(如SELECT,INSERT,UPDATE或DELETE)中的SELECT语句。 通常,可以在任何使用表达式的地方使用子查询。 例子 比如从以下的病人信息中查询最近一个月住院年龄最大的病人信息 从以上的信息中我们知道病人出生日期BIRTHDATE ,限制取数的时…

chatgpt赋能python:Python二次方函数——优化您的SEO排名

Python二次方函数——优化您的SEO排名 如果您是一位拥有10年Python编程经验的工程师&#xff0c;您可能已经知道Python是一个强大的编程语言&#xff0c;虽然它不是专业的SEO工具&#xff0c;但是它可以用于优化SEO排名&#xff0c;尤其是当您需要通过Python编写一个二次方函数…

【计算机组成原理与体系结构】指令系统

目录 一、指令格式 二、扩展操作码 三、指令寻址 四、数据寻址 五、x86汇编指令 六、RISC-V架构 七、RV32I指令集 一、指令格式 根据地址码格式分类 根据操作类型进行分类 二、扩展操作码 三、指令寻址 指令寻址&#xff1a;下一条预执行指令的地址&#xff08;始终有…

chatgpt赋能python:Python如何从右往左取数

Python如何从右往左取数 在Python编程中&#xff0c;有时候需要从右往左获取列表、字符串等数据结构的元素&#xff0c;而不是从左往右。这样做的好处在于可以更快地访问最后几个元素&#xff0c;或者进行一些反向操作。本文将介绍Python中从右往左取数的方法。 索引与切片 …

【DC综合】DC工具 report_timing 命令的一些选项

report_timing选项 report_timing 的全部参数[ -to to_list | -rise_to rise_to_list | -fall_to fall_to_list ][ -from from_list | -rise_from rise_from_list | -fall_from fall_from_list ][ -path_type short | full | full_clock | full_clock_expanded | only | end ][…

智能工厂元宇宙 工业互联网云平台的架构与功能解析

随着工业领域的数字化转型和物联网技术的发展&#xff0c;工业互联网云平台作为实现智能制造和工业自动化的关键技术之一&#xff0c;引起了广泛关注。工业互联网云平台通过将传感器数据、设备状态和生产信息等连接到云端&#xff0c;实现数据的采集、存储、分析和应用&#xf…

chatgpt赋能python:Python中如何一行输入多个数据

Python中如何一行输入多个数据 在Python中&#xff0c;我们有时需要一次性输入多个数据&#xff0c;作为程序的输入。常见的情况包括输入一组数字、输入多个字符串等。在本文中&#xff0c;我们将介绍多种方法来实现一行输入多个数据。 方法一&#xff1a;使用input函数 Pyt…

IP组播5_PIM-SM(ASM)详解

目录 1.PIM-SM&#xff08;ASM&#xff09;简介 2.PIM-SM&#xff08;ASM&#xff09;工作原理 2.1 什么是DR&#xff1f; 2.2 什么是RP&#xff1f; 2.2.1 静态RP 2.2.2 动态RP 2.3 组播源注册和RPT建立 2.4 SPT切换 3. PIM-SM&#xff08;ASM&#xff09;实验 3.1 …

【力扣刷题 | 第五天】

目录 前言&#xff1a; 15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 结束&#xff1a; 前言&#xff1a; 今天两道题类型相似&#xff0c;解法思路一致&#xff0c;都利用了双指针技术。 15. 三数之和 - 力…

PostgreSQL数据库分区裁剪——enable_partition_pruning

在PostgreSQL 10版本之前&#xff0c;PostgreSQL数据库实际上是没有单独的创建分区表的DDL语句&#xff0c;都是通过表继承的原理来创建分区表&#xff0c;这样使得在PostgreSQL中使用分区表不是很方便&#xff0c;到PostgreSQL 10之后&#xff0c;PostgreSQL扩展了创建表的DDL…

idea插件开发-PSI

程序结构接口&#xff08;Program Structure Interface&#xff09;简称PSI&#xff0c;PSI是IDEA插件开发最复杂的一块内容&#xff0c;后续会有大量实战来强化理解此处的知识。PSI是IntelliJ 平台中的一个层&#xff0c;负责解析文件并创建语法和语义代码模型&#xff0c;为平…

Linux 导入MySQL数据库(四)

文章目录 一、导出数据库二、导入数据库&#xff08;方法一&#xff09;1. 通过FinalShell连接服务器&#xff0c;登录mysql&#xff1a;2. 新建数据库3. 使用新建的数据库4. 对数据库进行编码设置5. 从路径中导入 SQL 文件数据 三、导入数据库&#xff08;方法二&#xff09;【…

为uni-cloud(Dcloud国产之辉)声明!

目录 uni-cloud的介绍 uni-cloud与uni-app的关系 uni-cloud与云原生的关系 uni-cloud的开发优点 uni-cloud与HBuilder X结合的优越性 uni-cloud高效解决"高并发" uni-cloud与阿里云、腾讯云完美结合 uni-cloud背后庞大的插件市场 美中不足 加油&#xff01…

chatgpt赋能python:Python代码保存:如何保存你的Python代码?

Python代码保存&#xff1a;如何保存你的Python代码&#xff1f; Python被广泛认为是学习编程的入门语言之一&#xff0c;因为它易于学习和使用&#xff0c;并且拥有大量的库和框架来处理各种任务。 在编写Python代码时&#xff0c;你可能会像大多数编程任务一样&#xff0c;…

实践项目三: 校园兼职平台(合作重构版)

项目说明 1 据了解&#xff0c;目前在校大学生80%以上有做兼职的需求&#xff0c;兼职打工已经不仅仅是经济困难的学生赚取生活费用的途径。调查显示&#xff0c;全球经济危机对就业产生冲击&#xff0c;用人单位对人员的社会实践能力要求提高&#xff0c;大学期间必要的社会实…

Java学习笔记(StringJoiner和集合)

StringJoiner StringJoiner与StringBuilder一样&#xff0c;也可以看成是一个容器&#xff0c;创建之后的内容是可变的 作用&#xff1a;提高字符串的操作效率&#xff0c;而且代码编写特别简洁&#xff0c;但是目前市场上很少有人用 构造方法&#xff1a; 方法名 说明 pub…

四、HAL_驱动机械按键

1、开发环境。 (1)KeilMDK&#xff1a;V5.38.0.0 (2)STM32CubeMX&#xff1a;V6.8.1 (3)MCU&#xff1a;STM32F407ZGT6 2、机械按键简介 (1)按键内部是机械结构&#xff0c;也就是内部是没有电路的。按键按下内部引脚导通&#xff0c;松开内部断开。 3、实验目的&原理…

Git、Github、Gitee的区别

⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;Git 目录 1、Git2、Gitee3、GitHub 什么是版本管理&#xff1f;   版本管理是管理各个不同的版本&#xff0c;出了问题可以及时回滚。 1、Git Git是一个分布式版本控制系统&#xff0c;用于跟踪和管理代码的变化。它是…

开源代码分享(2)—综合能源系统零碳优化调度

参考文献&#xff1a; Optimal dispatch of zero-carbon-emission micro Energy Internet integrated with non-supplementary fired compressed air energy storage system | SGEPRI Journals & Magazine | IEEE Xplore 1.引言 全球能源危机和环境污染的双重压力促使能量…