Vue3兄弟组件传值(同级别组件传值Vue3)

简述:

  • Vue3兄弟组件传值,我们可以使用"Mitt"插件来实现。通过使用事件总线的方式,我们可以将数据从一个组件传递给另一个组件,实现兄弟组件之间的通信。

  • 或者利用 Vue 3 自身的provide 和 inject 响应式 API 来实现兄弟组件之间的数据共享和通信。这里来给大家介绍下vue3中,兄弟组件传值的两种方式。

一、在 Vue 3 中,我们可以使用 setup() 函数和 provide 和 inject 响应式 API 来实现兄弟组件之间的数据共享和通信。这里我们不使用任何外部库,仅利用 Vue 3 自身的功能

1、首先,我们创建一个提供共享数据的组件(ProviderComponent.vue),它将使用 provide 函数来提供数据:

组件1:ProviderComponent.vue

<!-- ProviderComponent.vue -->  
<template>
  <div>
    <p>Shared Data: {{ sharedData }}</p>
    <slot></slot>
    //注意这里的插槽,用于存放兄弟组件
  </div>
</template>  
  
<script setup>  
import { ref, provide } from 'vue';
const sharedData = ref('测试数据');
provide('sharedData', sharedData);

</script>

2、然后,我们创建两个兄弟组件(SiblingA.vue 和 SiblingB.vue),它们都将通过 inject 来接收提供的数据,并且可以进行修改:

组件2:SiblingA.vue

<!-- SiblingA.vue -->  
<template>
  <div>
    <p>组件 A</p>
    <p>{{ sharedData }}</p>
    <button @click="increaseData">点击触发</button>
  </div>
</template>  
  
<script setup>  
import { inject } from 'vue';
// 使用 inject 函数接收提供的数据
const sharedData = inject('sharedData');
const increaseData = () => {
  sharedData.value = "更改后的数据";
}

</script>

组件3:SiblingA.vue

<!-- SiblingB.vue -->  
<template>
  <div>
    <p>组件 B</p>
    <p>Shared Data from Provider: {{ sharedData }}</p>
  </div>
</template>  
  
<script setup>  
import { inject } from 'vue';
// 使用 inject 函数接收提供的数据  
const sharedData = inject('sharedData');

</script>

3、最后,我们在父组件ParentComponent.vue中使用 ProviderComponent 和两个兄弟组件:

组件4:ParentComponent.vue

<!-- ParentComponent.vue -->  
<template>  
  <div>  
    <ProviderComponent>  
      <SiblingA />  
      <SiblingB />  
    </ProviderComponent>  
  </div>  
</template>  
  
<script setup>  
import ProviderComponent from './ProviderComponent.vue';  
import SiblingA from './SiblingA.vue';  
import SiblingB from './SiblingB.vue';  

</script>

4、注意这里一共需要用到4个组件:

  • 共享数据的组件:        ProviderComponent.vue
  • 兄弟组件1:     SiblingA.vue
  • 兄弟组件2:     SiblingB.vue
  • 父组件:       ParentComponent.vue

看下效果:

可以看到兄弟组件,通过中间件的方式,传值成功。

小结:

  • 在这实例中,ProviderComponent共享组件 提供了 sharedData数据,并通过provide函数传递数据,而 SiblingA 和 SiblingB 都使用inject函数注入了这个数据。

  • 当 SiblingA 中的按钮被点击时,它会增加共享组件 sharedData 的值,这个变化也会反映到 SiblingB 中,因为它们是同一个响应式引用的不同视图。

  • 这就是使用 Vue 3 的 provide 和 inject API,以及 setup() 函数和 ref 来实现兄弟组件之间通信的一种方式。这种方法避免了使用全局状态管理库,并且保持了组件之间的解耦。

二、上面使用Vue 3 自身的AP实现了兄弟组件传值,这里我们可以使用 Vue3 的 setup 语法糖结合第三方库 mitt 来实现。mitt是一个小巧且快速的TypeScript实现的EventEmitter 3封装库,专门用于Vue 3应用中的组件通信。在Vue 2.x中,通常使用EventBus进行组件间的通信,但在Vue 3.x中,推荐使用mitt作为替代方案。

1、首先,确保已经安装好mitt库,安装命令如下;

npm install mitt
//或者
npm install mitt --save

2、创建事件总线。在项目中创建一个单独的js文件,例如eventBus.js,用于初始化并暴露 mitt 实例作为全局事件总线:

import mitt from 'mitt';

const bus = mitt();

export default bus;

3、兄弟组件通信实现。创建兄弟组件,假设我们有两个兄弟组件A和B,组件A需要向组件B传递数据。在组件A中,通过导入事件总线,并在setup函数中发布事件:

// ComponentA.vue
<template>
  <!-- 省略模板内容 -->
  <button @click="choseBusSetData">发送数据给兄弟组件</button>
</template>

<script setup>
import { ref } from 'vue';
import bus from '@/utils/eventBus.js'; // 引入事件总线
const dataToEmit = ref('Hello, Brother!');
function choseBusSetData() {
  bus.emit('brotherEvent', dataToEmit.value) // 发布事件并附带数据
}
</script>

4、接着,在组件B中,同样引入事件总线并在setup函数中订阅该事件:

// ComponentB.vue
<script setup>
import { onMounted, onUnmounted } from 'vue';
import bus from '@/utils/eventBus.js'; // 引入事件总线
let receivedData = '';
onMounted(() => {
  // 订阅事件
  const off = bus.on('brotherEvent', (data) => {
    receivedData = data
    console.log('Received data from brother:', receivedData)
    // 在这里可以更新组件B的状态或者执行其他业务逻辑
  })
  // 当组件卸载时,取消事件订阅以避免内存泄漏
  onUnmounted(() => {
    off()
  })
})
</script>

5、这样,当组件A中的按钮被点击时,会触发emitData方法,通过事件总线发送数据。而组件B则会在挂载后监听这个事件,一旦接收到数据就会在控制台打印出来,实现了兄弟组件间的通信。

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

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

相关文章

STM32FreeRTOS消息队列(STM32Cube高效开发)

文章目录 一、队列&#xff08;一&#xff09;简介&#xff08;二&#xff09;FreeRTOS队列特点1、入队阻塞&#xff1a;队列满了&#xff0c;此时无法继续写入数据2、出队阻塞&#xff1a;队列为空&#xff0c;此时无法读出数据3、入队阻塞解除&#xff0c;有多个任务等待时&a…

实战:基于特征词的语音唤醒

本章前面介绍了纯理论知识&#xff0c;目的是阐述语音识别的方法。接着搭建了开发环境&#xff0c;让读者可以动手编写代码。下面以识别特定词为例&#xff0c;使用深度学习方法和Python语言实现一个实战项目——基于特征词的语音唤醒。 说明&#xff1a;本例的目的是演示一个…

当Sora风靡,AI风潮吹醒金融科技

以下文章来源&#xff1a;凤凰网 前有OpenAI发布了Sora&#xff0c; 后有苹果放弃了秘密进行了十年的造车项目&#xff0c;转身拥抱AI&#xff0c; 再有国内市场上此起彼伏的AI呐喊声&#xff0c; 一场以AI为主导的新热浪&#xff0c;正在来袭。 当AI的风潮开始兴盛&#x…

JavaScript 原型链继承:掌握面向对象的基础

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

springboot + jpa + 达梦数据库兼容 Mysql的GenerationType.IDENTITY主键生成策略

导入达梦数据库对hibernate的方言包 <dependency><groupId>com.dameng</groupId><artifactId>DmDialect-for-hibernate5.6</artifactId><version>8.1.2.192</version></dependency>配置文件中添加方言配置和主键生成策略配置…

(译) 理解 Prometheus 的范围向量 (Range Vector)

Prometheus 中 Range Vector 的概念是有一点不直观的&#xff0c;除非你彻底阅读并理解了官方提供的文档。谁会这样做呢&#xff0c;去读官方文档&#xff1f;大多的人应该会花些错误的时间去做了一些错误的事情&#xff0c;然后随机去寻找一篇像本文一样的文章去理解这个概念&…

2024年Java者未来的出路在哪里,java多线程面试

重要 大环境对于我们能力要求越来越高&#xff0c;医学专家又说今年冬天新冠肺炎将“席卷重来”。 如果疫情再次爆发&#xff0c;势必将再次影响企业的正常运作&#xff0c;一波裁员浪潮你又能否抗住&#xff1f; 不管如何&#xff0c;明年金三银四又是一波跳槽时机&#xf…

AbaqusCST仿真软件功能对比简介

一、功能对比 支持维度CST&#xff1a;用于设计、分析和优化电磁部件及系统。适用于整个 EM 范围内各类应用领域的电磁场解算。Abaqus&#xff1a;ABAQUS 是一套功能强大的工程模拟的有限元软件&#xff0c;其解决问题的范围从相对简单的线性分析到复杂的非线性问题。 ABAQUS 包…

基于springboot+vue的精简博客系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

flutter弹窗动画,2024年上半年最接地气的Android面经

正文 腾讯研发人数将近 2 万人&#xff0c;T4 级别的人数大概也不超过 500 人&#xff0c;这还是在近两年 T3 到 T4 级别人数增多的情况下。 该资料一共有五大章节&#xff0c;452页&#xff0c;是这位腾讯T4大佬耗时半个月熬夜整理出来的。 目录 第一章 深入解析 Binder. …

Java面试题【必知必会】Mybatis常见面试题(2024)

近期一直在准备面试&#xff0c;所以为了巩固知识&#xff0c;也为了梳理&#xff0c;整理了一些java的基础面试题&#xff01;同时也希望各位英雄和女侠能够补充&#xff01;不胜荣幸&#xff01;&#xff01;&#xff01; 名称地址Java面试题【必知必会】基础&#xff08;202…

Web3 赛道屠夫:「铁顺」是谁?

撰文&#xff1a;Terry 加密世界从不缺传奇故事&#xff0c;从不会编程的「失业青年」Hayden Adams 一入 Web3 便推出巅峰之作 Uniswap&#xff08;《交易平台搅局者「Uniswap 之父」&#xff0c;不会编程的「失业青年」&#xff0c;出手即巅峰》&#xff09;&#xff0c;到 An…

VMware虚拟机安装linux教程

CentOS7下载 下载 (centos.org)https://www.centos.org/download/新建虚拟机 选择自定义安装 这里要注意兼容性&#xff0c;如果是VMware12创建的虚拟机复制到VM11、10或者更低的版本会出现一不兼容的现象。如果是用VMware10创建的虚拟机在VMware12中打开则不会出现兼容性问题…

二,几何相交----2.线段相交测试----(1)bruteforce

将与X轴平行的线段扩展到一般平面上的线段。 则可以使用burteforce两两测试&#xff0c;使用四次toleft即可。比如&#xff0c;线段(a,b)和线段(c,d)相交&#xff0c;必然线段的两个端点在另一个线段的两侧。这样时间复杂度就是成为了o(n2) 其实&#xff0c;时间复杂度可以降低…

半导体分析实验常用清洗器皿特氟龙塑料PFA实验室耗材

晶圆是一种用于制造集成电路和其他半导体器件的基础材料&#xff0c;通常是由单晶硅制成的圆形薄片&#xff0c;随着半导体行业的兴起&#xff0c;其作为行业内常用元件的基础材料&#xff0c;为了保证它可以正常工作&#xff0c;晶圆表面要保持洁净&#xff0c;无不相关的颗粒…

酷开科技以酷开系统为媒介,打造欢乐生活场景

家人相聚在一起的时光总是那么美好&#xff0c;在欢聚的日子里&#xff0c;我们也总是希望能够让时间变得慢一点&#xff0c;再慢一点&#xff0c;但是随着春节假期的结束&#xff0c;很多人已经开始了新一年的忙碌&#xff0c;大家纷纷回到工作、学习岗位&#xff0c;回归之前…

自动驾驶预测与决策规划(nuplan数据集)

欢迎大家关注我的B站&#xff1a; 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 目录 1.概述 2 数据采集 3.开环与闭环仿真 4.数据注释 5.场景 6.规划框架 6.1Train 6.2Simulation 6.3Metric 6.4Visualization 7.下载…

如何使用DS file+cpolar内网穿透实现远程访问本地群晖NAS传输文件

文章目录 1. 群晖安装Cpolar2. 创建TCP公网地址3. 远程访问群晖文件4. 固定TCP公网地址5. 固定TCP地址连接 DS file 是一个由群晖公司开发的文件管理应用程序&#xff0c;主要用于浏览、访问和管理存储在群晖NAS&#xff08;网络附加存储&#xff09;中的文件。这个应用程序具有…

阿里云2024年有什么优惠活动?阿里云30个热门优惠活动汇总

对于想要购买阿里云各种云产品的用户来说&#xff0c;不管是新用户还是老用户&#xff0c;最为关心的是阿里云当下有哪些优惠活动&#xff0c;本文汇集了2024年阿里云官方目前正在进行中的所有优惠活动&#xff0c;其中优惠券和代金券活动4个&#xff0c;官方精选活动10个&…

鹅厂打工8年,我为啥突然裸辞?

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ 原文&#xff1a;以下文章来源于沐洒 &#xff0c;作者ASCII26 今天跟大家分享一个重磅消息&#xff0c;沐洒终于从腾讯离职了&#xff01; 不知不觉已经在鹅厂打了8年工&#xff0c;如果说在大厂里工作如同在高校…