Event Bus实现兄弟组件通信

Event Bus实现兄弟组件通信

Event Bus(事件总线)是一种组件间通信的模式,主要用于非父子关系的组件之间的通信。它通过创建一个全局的 Vue 实例作为事件中心,任何组件都可以通过这个中心来触发事件或监听事件,从而实现跨组件的数据传递和状态同步。

实现原理:

  • 创建全局事件总线: 创建一个单独的 Vue 实例作为事件总线,用于在不同组件之间传递消息。

  • 发送事件: 在一个组件中触发事件,通过 EventBus.$emit 方法发送事件和数据。

  • 接收事件: 在另一个组件中监听事件,通过 EventBus.$onEventBus.$once 方法接收事件和数据。

  • 清理事件监听器: 组件销毁时,移除事件监听器,避免内存泄漏。

优点
  • 解耦: 组件之间不需要直接引用彼此,提高了组件的独立性和可复用性。

  • 灵活性: 可以方便地扩展事件和数据传递,适用于复杂的多组件通信场景。

  • 易于维护: 事件总线模式使得组件之间的通信更加清晰,便于维护和调试。

缺点
  • 命名冲突: 如果多个组件使用相同的事件名称,可能会导致命名冲突。

  • 调试困难: 由于事件总线中的事件传递路径不明确,调试时可能较难追踪问题所在。

  • 性能开销: 频繁触发事件可能导致性能开销增加,尤其是在大型应用中。

  • 状态管理复杂: 对于更复杂的状态管理,使用 Vuex 可能更为合适,特别是当组件间的通信变得更加复杂时。

代码示例

vue2.x 使用

创建全局事件总线:

// main.jsimport Vue from "vue";
import App from "./App";
import store from "./store";
import router from "./router";new Vue({el: "#app",router,store,beforeCreate() {Vue.prototype.$bus = this;},render: (h) => h(App),
});

parent.vue (父组件)

// parent.vue<template><div class="parent"><h2>父组件</h2><div class="box"><first-son /><second-son /></div></div>
</template><script>
import firstSon from './firstSon.vue';
import secondSon from './secondSon.vue';
export default {name: 'parent',data() {return {}},components: { firstSon, secondSon },methods: {}
}
</script>

firstSon.vue (子组件1)

// firstSon.vue<template><div class="son"><h2>子组件1</h2><el-button type="primary" @click="sendMessage">发送消息</el-button></div>
</template><script>
export default {name: 'firstSon',data() {return {msg: 'Hello from brother component!'}},methods: {sendMessage(){this.$bus.$emit('sendBrotherMsg', this.msg);}}
}
</script>

secondSon.vue (子组件2)

// secondSon.vue<template><div class="grandpa"><h2>子组件2</h2><div>{{ msg }}</div></div>
</template><script>
export default {name: 'secondSon',data() {return {msg: '',}},created() {this.getSendMessage();},beforeDestroy() {// 清理事件监听器this.$bus.$off('sendBrotherMsg')},methods: {getSendMessage() {// 添加事件监听器接受兄弟组件传过来的数据this.$bus.$on('sendBrotherMsg', msg => {console.log('msg::: ', msg);this.msg = msg;})}}
}
</script>

上述示例中:

  • parent.vue 组件为父组件,导入 firstSon.vuesecondSon.vue 组件。

  • firstSon.vue 组件点击按钮触发事件 this.$bus.$emit() 方法发送 sendBrotherMsg 事件和 this.msg 参数。

  • secondSon.vue 组件通过 this.$bus.on() 接收 sendBrotherMsg 事件和 msg 参数,并在 cerated 生命周期执行调用。

vue3.x使用

在 Vue 3.x 中,虽然不再推荐使用全局的 Vue 实例作为事件总线(因为 Vue 3 已经移除了全局 Vue 构造函数),但我们仍然可以使用类似的模式来实现兄弟组件间的通信。通常我们会创建一个普通的 JavaScript 模块来充当事件总线的角色。下面是如何在 Vue 3 中实现这一点的示例。

创建事件总线模块

首先,我们需要创建一个事件总线模块,它可以是一个简单的 JavaScript 对象,用来存储事件监听器,并提供 onemit 方法来监听和触发事件。

// eventBus.jsexport const EventBus = {listeners: {} as Record<string, Function[]>,$on(event: string, callback: (...args: any[]) => void): void {if (!this.listeners[event]) {this.listeners[event] = [];}this.listeners[event].push(callback);},$emit(event: string, ...args: any[]): void {const callbacks = this.listeners[event];if (callbacks) {callbacks.forEach(callback => callback(...args));}},$off(event: string, callback: (...args: any[]) => void): void {const callbacks = this.listeners[event];if (callbacks) {this.listeners[event] = callbacks.filter(cb => cb !== callback);}}
};

parent.vue (父组件)

// parent.vue<template><div class="parent"><h2>父组件</h2><div class="box"><firstSon /><secondSon /></div></div>
</template><script setup lang="ts" name="parent">
import firstSon from './firstSon.vue';
import secondSon from './secondSon.vue';
</script>

firstSon.vue (子组件1)

// firstSon.vue<template><div class="firstSon"><h2>子组件1</h2><el-button type="primary" @click="sendMessage">发送消息</el-button></div>
</template><script setup lang="ts" name="firstSon">
import { EventBus } from './eventBus.ts';function sendMessage() {const data = { key: 'value' };EventBus.$emit('sendBrotherMsg', data);
}
</script>

secondSon.vue (子组件2)

// secondSon.vue<template><div class="secondSon"><h2>子组件2</h2><div>{{ receivedMessage }}</div></div>
</template><script setup lang="ts" name="secondSon">
import { ref, onMounted, onBeforeUnmount } from 'vue';
import { EventBus } from './eventBus';const receivedMessage = ref('');onMounted(() => {// 监听事件EventBus.$on('sendBrotherMsg', handleData);
});onBeforeUnmount(() => {EventBus.$off('sendBrotherMsg', handleData);
});// 接受参数
const handleData = (data: { key: string }) => {console.log('data::: ', data);receivedMessage.value = data.key;
};
</script>

通过上述示例,我们可以看到:

  • 创建事件总线:使用一个简单的 TypeScript 对象作为事件总线。
  • 触发事件:在组件 firstSon.vue 中通过 EventBus.$emit 方法触发事件,并传递数据。
  • 监听事件:在组件 secondSon.vue 中通过 onMounted 生命周期钩子添加事件监听器,并通过 handleData 函数处理接收到的数据。
  • 清理事件监听器:在组件销毁之前,通过 onBeforeUnmount 生命周期钩子移除事件监听器,防止内存泄漏。

总结

Event Bus 是 Vue 中一种常用的组件间通信模式,它利用全局的 Vue 实例作为事件中心,允许组件之间通过触发和监听事件来进行通信。这种模式简单易用,适用于简单的跨组件通信场景。然而,在更复杂的项目中,可能需要考虑使用 Vuex 进行状态管理,以更好地组织和管理全局状态

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

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

相关文章

Qt篇——Qt在msvc编译下提示“C2001:常量中有换行符“的错误

在pro文件中添加以下配置即可&#xff1a; msvc{QMAKE_CFLAGS /utf-8QMAKE_CXXFLAGS /utf-8 }

双指针(7)_单调性_三数之和

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 双指针(7)_单调性_三数之和 收录于专栏【经典算法练习】 本专栏旨在分享学习C的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 题目…

Redis 常用命令总结

文章目录 目录 文章目录 1 . 前置内容 1.1 基本全局命令 KEYS EXISTS ​编辑 DEL EXPIRE TTL TYPE 1.2 数据结构和内部编码 2. String类型 SET GET MGET MSET SETNX INCR INCRBY DECR DECYBY INCRBYFLOAT 命令小结 内部编码 3 . Hash 哈希类型 HSET …

gpt4最新保姆级教程

如何使用 WildCard 服务注册 Claude3 随着 Claude3 的震撼发布&#xff0c;最强 AI 模型的桂冠已不再由 GPT-4 独揽。Claude3 推出了三个备受瞩目的模型&#xff1a;Claude 3 Haiku、Claude 3 Sonnet 以及 Claude 3 Opus&#xff0c;每个模型都展现了卓越的性能与特色。其中&a…

数据结构基本知识

一、什么是数据结构 1.1、组织存储数据 ---------》内存&#xff08;存储&#xff09; 1.2、研究目的 如何存储数据&#xff08;变量&#xff0c;数组....)程序数据结构算法 1.3、常见保存数据的方法 数组&#xff1a;保存自己的数据指针&#xff1a;是间接访问已经存在的…

【Vue】pnpm创建Vue3+Vite项目

初始化项目 &#xff08;1&#xff09;cmd切换到指定工作目录&#xff0c;运行pnpm create vue命令&#xff0c;输入项目名称后按需安装组件 &#xff08;2&#xff09;使用vs code打开所创建的项目目录&#xff0c;Ctrl~快捷键打开终端&#xff0c;输入pnpm install下载项目…

[概率论] 随机变量的分布函数 (一)

文章目录 1.随机变量的分布函数2.离散型随机变量的分布函数3.连续性随机变量的分布函数 1.随机变量的分布函数 设X XX是一个随机变量&#xff0c;x xx是任意实数&#xff0c;则函数 几何表示 性质&#xff08;一个函数是分布函数的充要条件&#xff09; 2.离散型随机变量的分布…

数据结构-图-存储-邻接矩阵-邻接表

数据结构-图-存储 邻接矩阵 存储如下图1,图2 图1 对应邻接矩阵 图2 #include<bits/stdc.h> #define MAXN 1005 using namespace std; int n; int v[MAXN][MAXN]; int main(){cin>>n;for(int i1;i<n;i){for(int j1;j<n;j){cin>>v[i][j];}}for(int…

深度解析Unix系统的基本概念及优缺点和原理

介绍 Unix系统是一种多用户、多任务、分时操作系统&#xff0c;起源于20世纪70年代初&#xff0c;由贝尔实验室开发。它具有强大的命令行接口和层次结构的文件系统&#xff0c;支持多种处理器架构&#xff0c;广泛应用于工程应用和科学计算等领域。 基本概念 一、Unix系统的起…

数据分析-15-时间序列异常检测及方法组合应用(案例实战)

参考异常值数据预警分析 1 异常检测 1.1 适用场景 异常检测算法适用的场景特点有: (1)无标签或者类别极不均衡; (2)异常数据跟样本中大多数数据的差异性较大; (3)异常数据在总体数据样本中所占的比例很低。 常见的应用案例如: 金融领域:从金融数据中识别”欺诈用…

数学建模强化宝典(13)M-K检验法

前言 M-K检验法&#xff0c;全称为Mann-Kendall检验法&#xff0c;是一种非参数的假设检验方法&#xff0c;广泛应用于时间序列数据的趋势性变化检验&#xff0c;特别是气候序列中的趋势分析和突变点检测。以下是对M-K检验法的详细介绍&#xff1a; 一、定义与背景 M-K检验法由…

嵌入式初学-C语言-数据结构--四

栈 1. 基本概念 栈是一种逻辑结构&#xff0c;是特殊的线性表。特殊在&#xff1a; 只能在固定的一端操作 只要满足上述条件&#xff0c;那么这种特殊的线性表就会呈现一种“后进先出”的逻辑&#xff0c;这种逻辑就被称为栈。栈 在生活中到处可见&#xff0c;比如堆叠的盘子…

Kubernetes部署(haproxy+keepalived)高可用环境和办公网络打通

HAProxy Keepalived 部署高可用性入口&#xff1a; 部署两台或多台节点运行 HAProxy 作为负载均衡器。使用 Keepalived 实现 VIP&#xff08;虚拟 IP&#xff09;&#xff0c;为 HAProxy 提供高可用性。Keepalived 会监控 HAProxy 的状态&#xff0c;如果主节点失效&#xff0…

Spring AOP,通知使用,spring事务管理,spring_web搭建

spring AOP AOP概述 AOP面向切面编程是对面向对象编程的延续&#xff08;AOP &#xff08;Aspect Orient Programming&#xff09;,直译过来就是 面向切面编程,AOP 是一种编程思想&#xff0c;是面向对象编程&#xff08;OOP&#xff09;的一种补充。&#xff09; 面向切面编…

【C++二分查找】1482. 制作 m 束花所需的最少天数

本文涉及的基础知识点 C二分查找 LeetCode1482. 制作 m 束花所需的最少天数 给你一个整数数组 bloomDay&#xff0c;以及两个整数 m 和 k 。 现需要制作 m 束花。制作花束时&#xff0c;需要使用花园中 相邻的 k 朵花 。 花园中有 n 朵花&#xff0c;第 i 朵花会在 bloomDay…

南京网站设计手机用的网站

近年来&#xff0c;随着移动互联网的快速发展&#xff0c;越来越多的用户通过手机浏览网页&#xff0c;这使得网站设计逐渐向移动端倾斜。在南京&#xff0c;网站设计特别注重适配手机端&#xff0c;这不仅是用户体验的提升&#xff0c;也是市场竞争的需要。一个响应式的网站能…

vue3 v-bind=“$attrs“ 的一些理解,透传 Attributes相关说明及事例说明

1、可能小伙伴们经常会在自己的项目中看到v-bind"$attrs"&#xff0c;这个一般是在自定义组件中看到。 比如&#xff1a; <template><BasicModalv-bind"$attrs"register"registerModal":title"getTitle"ok"handleSubm…

前端框架有哪些 如何选择和优缺点

前端框架是用于构建用户界面的工具和库&#xff0c;它们提供了一套预定义的组件、样式和交互模式&#xff0c;帮助开发者更高效地开发前端应用。目前市面上存在多种前端框架&#xff0c;每种框架都有其独特的优势和缺点。以下是一些常见的前端框架及其优势和缺点的概述&#xf…

Python进程间网络远程通讯方式:socket、pipe、RPC详解!

背景 最近在进行开发工作的时候&#xff0c;遇到了一个场景&#xff1a; pc程序需要和安卓设备进行通讯和接口调用。 此时就需要进行远程调用方法。然而大学时代有关于远程过程调用的知识都还给了老师……所以在此进行一个复习&#xff0c;并进行实战演练&#xff01; 网络…

Java八股文总结四

集合类 一、什么是集合以及使用的好处&#xff1f;Java有哪些常见的集合类&#xff1f; 集合概念 集合就是一个放数据的容器&#xff0c;准确的说是放数据对象引用的容器 集合类存放的都是对象的引用&#xff0c;而不是对象的本身 集合类型主要有3种&#xff1a;set(集&…