Vue3中实现插槽使用

目录

一、前言

二、插槽类型

三、示例

 四、插槽的分类实现

1. 基本插槽

2. 命名插槽

3. 默认插槽内容

4. 作用域插槽(Scoped Slots)

5. 多插槽与具名插槽组合


一、前言

    在 Vue 3 中,插槽(Slot)用于实现组件的内容分发机制,它允许你将父组件的内容传递给子组件,从而实现组件的灵活组合和重用。Vue 3 插槽的基本使用和 Vue 2 有些相似,但也引入了一些新的特性。下面是一些常见的插槽使用方式。

二、插槽类型

Vue 3 插槽的使用方式非常灵活,允许你根据需求选择最适合的插槽类型:

  • 默认插槽:用于简单的内容传递。
  • 命名插槽:用于多个插槽,帮助你分配不同内容到不同的位置。
  • 作用域插槽:允许子组件传递数据给父组件,以便父组件动态渲染插槽内容。
  • 具名插槽组合:可以在一个组件中使用多个具名插槽,灵活分配父组件的内容。

三、示例

分析:

当你需要实现该页面的的布局时,是否会想到使用插槽来优化代码?以上页面中,我的任务、检测反馈、监控区域、人脸设别告警、设备总览六个模块中,框架的模板使用的是同一个框架,所以在这时就可以像以下图中进行组件优化。

代码示例:

首先,你需要在src/components/目录下创建一个子组件TaskFeedback.vue,并添加如下代码:

<template>
  <div class="task-feedback">
    <!-- 使用具名插槽 -->
    <slot name="header"></slot>

    <!-- 默认插槽 -->
    <slot></slot>

    <!-- 其他插槽 -->
    <slot name="footer"></slot>
  </div>
</template>

<script>
export default {
  name: 'TaskFeedback',
};
</script>

<style scoped>
.task-feedback {
  /* 添加样式 */
}
</style>

然后,在父组件中引入并使用TaskFeedback组件,并通过插槽传递内容:

<!-- 在父组件中使用 TaskFeedback 组件 -->
<template>
  <div>
    <TaskFeedback>
      <!-- 插入头部内容到 header 插槽 -->
      <template v-slot:header>
        <h1>我的任务检测反馈</h1>
      </template>

      <!-- 插入主要内容到默认插槽 -->
      <table>
        <thead>
          <tr>
            <th>类型</th>
            <th>告警时间</th>
            <th>位置</th>
          </tr>
        </thead>
        <tbody>
          <tr v-for="(item, index) in feedbackItems" :key="index">
            <td>{{ item.type }}</td>
            <td>{{ item.time }}</td>
            <td>{{ item.location }}</td>
          </tr>
        </tbody>
      </table>

      <!-- 插入底部内容到 footer 插槽 -->
      <template v-slot:footer>
        <p>总数据量: {{ totalDataCount }}</p>
      </template>
    </TaskFeedback>
  </div>
</template>

<script>
import TaskFeedback from './components/TaskFeedback.vue';

export default {
  components: {
    TaskFeedback,
  },
  data() {
    return {
      feedbackItems: [
        { type: '温度异常', time: '2023-08-20 16:21:29', location: '园区A区' },
        // 更多数据...
      ],
      totalDataCount: 50,
    };
  },
};
</script>

我们使用了三个插槽:

  • v-slot:header用于插入头部内容。
  • 默认插槽用于插入主要的内容。
  • v-slot:footer用于插入底部内容。

可以根据实际需要自定义每个插槽的内容,使界面更具灵活性和可扩展性。

 四、插槽的分类实现

1. 基本插槽

基本插槽允许父组件传递内容到子组件中的指定位置。父组件内容会替换子组件中指定 <slot> 标签的位置

<!-- Parent.vue -->
<template>
  <Child>
    <p>This is some content from the parent</p>
  </Child>
</template>

<script>
import Child from './Child.vue';
export default {
  components: { Child }
};
</script>

<!-- Child.vue -->
<template>
  <div>
    <slot></slot>  <!-- 插槽的位置 -->
  </div>
</template>

在这个例子中,父组件 Parent 向子组件 Child 传递了 <p> 标签内容,这些内容会替换子组件中的 <slot></slot> 部分。

2. 命名插槽

如果你需要多个插槽,可以为每个插槽指定一个名称。父组件可以将内容插入到指定的命名插槽中。

<!-- Parent.vue -->
<template>
  <Child>
    <template #header>
      <h1>Header Content</h1>
    </template>
    <template #footer>
      <p>Footer Content</p>
    </template>
  </Child>
</template>

<script>
import Child from './Child.vue';
export default {
  components: { Child }
};
</script>

<!-- Child.vue -->
<template>
  <div>
    <header>
      <slot name="header"></slot>  <!-- 命名插槽 -->
    </header>
    <footer>
      <slot name="footer"></slot>  <!-- 命名插槽 -->
    </footer>
  </div>
</template>

在这个例子中,父组件为 headerfooter 插槽分别传递了内容。子组件通过 <slot name="header"><slot name="footer"> 分别插入不同的内容。

3. 默认插槽内容

如果父组件没有传递内容给某个插槽,可以为插槽指定默认内容。

<!-- Parent.vue -->
<template>
  <Child>
    <!-- 没有传递给插槽内容,使用默认插槽内容 -->
  </Child>
</template>

<script>
import Child from './Child.vue';
export default {
  components: { Child }
};
</script>

<!-- Child.vue -->
<template>
  <div>
    <slot>默认内容</slot>  <!-- 如果父组件没有传递内容,将使用默认内容 -->
  </div>
</template>

当父组件没有传递任何内容时,子组件中的 <slot> 会显示默认内容“默认内容”。

4. 作用域插槽(Scoped Slots)

有时你需要在插槽中传递一些数据给父组件,这时候就需要使用作用域插槽。作用域插槽允许子组件将数据传递给父组件,让父组件能动态渲染插槽内容。

<!-- Parent.vue -->
<template>
  <Child v-slot:default="slotProps">
    <p>接收到的 message: {{ slotProps.message }}</p>
  </Child>
</template>

<script>
import Child from './Child.vue';
export default {
  components: { Child }
};
</script>

<!-- Child.vue -->
<template>
  <div>
    <slot :message="message"></slot>  <!-- 通过作用域插槽将数据传递给父组件 -->
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello from Child!'
    };
  }
};
</script>

在这个例子中,子组件通过 v-slot 绑定了一个作用域插槽,传递了一个 message 给父组件。父组件通过 slotProps 获取到这个数据并显示。

5. 多插槽与具名插槽组合

你可以在一个组件中使用多个具名插槽,这允许父组件根据不同的插槽名称传递不同的内容。

<!-- Parent.vue -->
<template>
  <Child>
    <template #header>
      <h1>This is the header</h1>
    </template>
    <template #main>
      <p>This is the main content</p>
    </template>
    <template #footer>
      <p>This is the footer</p>
    </template>
  </Child>
</template>

<script>
import Child from './Child.vue';
export default {
  components: { Child }
};
</script>

<!-- Child.vue -->
<template>
  <div>
    <header>
      <slot name="header"></slot>
    </header>
    <main>
      <slot name="main"></slot>
    </main>
    <footer>
      <slot name="footer"></slot>
    </footer>
  </div>
</template>

这里,父组件为 headermainfooter 提供了不同的内容,子组件会根据插槽名称进行插入。 

 

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

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

相关文章

海思3403对RTSP进行目标检测

1.概述 主要功能是调过live555 testRTSPClient 简单封装的rtsp客户端库&#xff0c;拉取RTSP流&#xff0c;然后调过3403的VDEC模块进行解码&#xff0c;送个NPU进行目标检测&#xff0c;输出到hdmi&#xff0c;这样保证了开发没有sensor的时候可以识别其它摄像头的视频流&…

【Java知识】Java性能测试工具JMeter

一文带你了解什么是JMeter 概述JMeter的主要功能&#xff1a;JMeter的工作原理&#xff1a;JMeter的应用场景&#xff1a;JMeter的组件介绍&#xff1a; 实践说明JMeter实践基本步骤&#xff1a;JMeter实践关键点&#xff1a; JMeter支持哪些参数化技术&#xff1f;常见插件及其…

Github客户端工具github-desktop使用教程

文章目录 1.客户端工具的介绍2.客户端工具使用感受3.仓库的创建4.初步尝试5.本地文件和仓库路径5.1原理说明5.2修改文件5.3版本号的说明5.4结合码云解释5.5版本号的查找 6.分支管理6.1分支的引入6.2分支合并6.3创建测试仓库6.4创建测试分支6.5合并分支6.6合并效果查看6.7分支冲…

Flutter中的Material Theme完全指南:从入门到实战

Flutter作为一款热门的跨平台开发框架&#xff0c;其UI组件库Material Design深受开发者喜爱。本文将深入探讨Flutter Material Theme的使用&#xff0c;包括如何借助Material Theme Builder创建符合产品需求的主题风格。通过多个场景和代码实例&#xff0c;让你轻松掌握这一工…

EWM 打印

目录 1 简介 2 后台配置 3 主数据 4 业务操作 1 简介 打印即输出管理&#xff08;output management&#xff09;利用“条件表”那一套理论实现。而当打印跟 EWM 集成到一起时&#xff0c;也需要利用 PPF&#xff08;Post Processing Framework&#xff09;那一套理论。而…

2024 同一个网段,反弹shell四种方法【linux版本】bash、python、nc、villian反弹shell图解步骤

实验环境准备&#xff08;同一个网段下&#xff0c;我是桥接的虚拟机&#xff09; 一、bash反弹shell 二、python反弹shell 三、nc反弹shell 四、villain反弹shell 实验环境准备&#xff08;同一个网段下&#xff0c;我是桥接的虚拟机&#xff09; 一台kali的linux(攻击者)…

ubuntu 安装kafka-eagle

上传压缩包 kafka-eagle-bin-2.0.8.tar.gz 到集群 /root/efak 目录 cd /root/efak tar -zxvf kafka-eagle-bin-2.0.8.tar.gz cd /root/efak/kafka-eagle-bin-2.0.8 mkdir /root/efakmodule tar -zxvf efak-web-2.0.8-bin.tar.gz -C /root/efakmodule/ mv /root/efakmodule/efak…

算法沉淀一:双指针

目录 前言&#xff1a; 双指针介绍 对撞指针 快慢指针 题目练习 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.和为s的两个数 7.三数之和 8.四数之和 前言&#xff1a; 此章节介绍一些算法&#xff0c;主要从leetcode上的题来讲解&#xff…

安全机制解析:深入SELinux与权限管理

Linux内核作为一个高自由度和优秀性能的操作系统核心&#xff0c;基于安全需求提供了完善的安全机制。内核安全机制不仅限于保护个人数据&#xff0c;还包括对运行环境和系统体系的线程化操作。本文将全方位分析Linux内核安全机制&#xff0c;以SELinux为主要代表&#xff0c;选…

对接阿里云实人认证

对接阿里云实人认证-身份二要素核验接口整理 目录 应用场景 接口文档 接口信息 请求参数 响应参数 调试 阿里云openApi平台调试 查看调用结果 查看SDK示例 下载SDK 遇到问题 本地调试 总结 应用场景 项目有一个提现的场景&#xff0c;需要用户真实的身份信息。 …

【2048】我的创作纪念日

机缘 2048天&#xff0c;不知不觉来csdn博客已经有2048天了&#xff0c;其实用csdn平台很久了&#xff0c;实际上写博客还是从2019年开始。 还记得最初成为创作者初心是什么吗&#xff1f; 最开始&#xff0c;主要是用来做笔记。平时工作中、学习中遇到的技术相关问题都会在cs…

docker运行ActiveMQ-Artemis

前言 artemis跟以前的ActiveMQ不是一个产品&#xff0c;原ActiveMQ改为ActiveMQ Classic, 现在的artemis是新开发的&#xff0c;和原来不兼容&#xff0c;全称&#xff1a;ActiveMQ Artemis 本位仅介绍单机简单部署使用&#xff0c;仅用于学习和本地测试使用 官网&#xff1a;…

[JAVA]MyBatis框架—如何获取SqlSession对象实现数据交互(基础篇)

假设我们要查询数据库的用户信息&#xff0c;在MyBatis框架中&#xff0c;首先需要通过SqlSessionFactory创建SqlSession&#xff0c;然后才能使用SqlSession获取对应的Mapper接口&#xff0c;进而执行查询操作 在前一章我们学习了如何创建MyBatis的配置文件mybatis.config.xm…

ThinkServer SR658H V2服务器BMC做raid与装系统

目录 前提准备 一. 给磁盘做raid 二. 安装系统 前提准备 磁盘和系统BMC地址都已经准备好&#xff0c;可正常使用。 例&#xff1a; 设备BMC地址&#xff1a;10.99.240.196 一. 给磁盘做raid 要求&#xff1a; 1. 将两个894G的磁盘做成raid1 2. 将两块14902G的磁盘各自做…

aws(学习笔记第十四课) 面向NoSQL DB的DynamoDB

aws(学习笔记第十四课) 面向NoSQL DB的DynamoDB 学习内容&#xff1a; 开发一个任务TODO管理器 1. 主键&#xff0c;分区键和排序键 DynamoDB的表定义和属性定义 表定义&#xff08;简单主键&#xff09; 表定义的命名需要系统名 _ 表名的形式&#xff0c;提前规划好前缀。…

机器学习—正则化和偏差或方差

正则化参数的选择对偏差和方差的影响 用一个四阶多项式&#xff0c;要用正则化拟合这个模型&#xff0c;这里的lambda的值是正则化参数&#xff0c;它控制着你交易的金额&#xff0c;保持参数w与训练数据拟合&#xff0c;从将lambda设置为非常大的值的示例开始&#xff0c;例如…

聚类分析 | MSADBO优化Spectral谱聚类优化算法

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于改进正弦算法引导的蜣螂优化算法(MSADBO)优化Spectral谱聚类&#xff0c;matlab代码&#xff0c;直接运行! 创新独家&#xff0c;先用先发&#xff0c;注释清晰&#xff0c;送MSADBO参考文献!优化参数 优化后的带…

STM32:ADC

目录 一、简介 二、结构 三、工作模式 四、使用流程 一、简介 模数转换器&#xff0c;ADC&#xff08;Analog-to-Digital Converter&#xff09;是将模拟信号转换为数字信号的电子设备。在STM32中&#xff0c;ADC用于处理来自传感器、麦克风等的模拟信号。STM32的ADC具有高…

candence : 如何利用EXCEL 绘制复杂、多管脚元件

如何利用EXCEL 绘制复杂、多管脚元件 前面的步骤直接略过 我们以STM32F407VEXX 系列 100pin 芯片为例讲解&#xff1a; 1、新建好一个空元件 2、使用阵列&#xff0c;放置管脚 点击 “ ok ” 3、选中所有管脚 右键 “edit properites” 出现如下页面 4、点击 左上角&…

vue内置指令和自定义指令

常见的指令&#xff1a; v-bind : 单向绑定解析表达式, 可简写为 :xxx v-model : 双向数据绑定 v-for : 遍历数组/对象/字符串 v-on : 绑定事件监听, 可简…