从 Vue3 回望 Vue2:事件总线的前世今生

从 Vue3 回望 Vue2:事件总线的前世今生

Vue3 开发者视角回顾 Vue2 中事件总线机制 的文章。文章将围绕事件总线的缘起、用法、局限与演进展开,帮助 Vue3 开发者理解 Vue2 通信方式的历史意义及现代替代方案。


一、前言:Vue3 时代,我们为何还要看 Vue2?

Vue3 的出现代表着 Vue 框架架构思想的一次深刻转变:
从基于选项的声明式组件模型,转向组合式、函数化、更可维护的逻辑表达方式。

但 Vue3 的前身 —— Vue2,至今依然活跃于大量老项目中。作为 Vue3 开发者,如果你:

  • 正在接手一个 Vue2 项目
  • 在做 Vue2 向 Vue3 的迁移
  • 想深入理解 Vue3 各种通信方式的“由来”

那么,你必须了解 Vue2 中一项非常核心、但如今已被淘汰的通信机制:事件总线(Event Bus)


二、事件总线是什么? —— Vue2 的“组件内广播电台”

在 Vue2 中,组件通信主要有以下几种方式:

  • 父传子:props
  • 子传父:$emit
  • 跨组件:Vuex(状态管理)
  • 非父子之间通信:事件总线(Event Bus)

定义:

事件总线是 Vue2 中一种基于 Vue 实例事件机制的跨组件通信方式,本质上是一个全局的事件调度中心

开发者通过它,实现组件之间“发布-订阅”关系:

  • 一个组件 触发事件EventBus.$emit('event-name', payload)
  • 另一个组件 监听事件EventBus.$on('event-name', callback)

三、事件总线的用法全景回顾

1. 创建事件总线对象

// event-bus.js
import Vue from 'vue'
export const EventBus = new Vue()

这个 EventBus 实例就像一个广播站,所有组件都可以监听和发送消息。


2. 使用场景示例

场景1:兄弟组件通信
// ComponentA.vue
EventBus.$emit('say-hello', '你好')// ComponentB.vue
EventBus.$on('say-hello', (msg) => {console.log('接收到消息:', msg)
})
场景2:打开弹窗、通知刷新等全局事件控制
EventBus.$emit('open-modal', { title: '确认删除?' })

四、Vue3 视角下的反思:事件总线的问题在哪里?

虽然事件总线在 Vue2 中灵活、快速、简单,但 Vue3 设计者最终选择移除这套机制,理由非常明确:

问题点Vue3 的设计理念
不透明、不可控无法追踪事件从哪里发出、何时被触发
易造成内存泄漏忘记 $off 导致事件残留
调试困难控制台看不到事件流
全局污染严重所有组件都依赖于同一个对象,耦合度高
类型不友好难以与 TypeScript 配合

Vue3 提倡明确的数据流方向函数化逻辑表达类型安全,因此摒弃了基于组件实例的事件通信方式。


五、Vue3 的现代替代方案有哪些?

1. 使用 mitt 构建轻量事件总线(推荐)

npm install mitt
// event-bus.ts
import mitt from 'mitt'
export const emitter = mitt()

组件使用方式:

// 发射事件
emitter.emit('say-hello', 'Hello')// 监听事件
emitter.on('say-hello', (msg) => {console.log('收到消息', msg)
})

💡 mitt 是 Vue3 世界中最接近 Vue2 EventBus 的替代方案,但它不依赖 Vue 本身,更轻量、可维护、支持 TS。


2. pinia:用于状态驱动的全局通信

当事件之间有状态依赖时,使用 pinia 替代事件总线,可以让通信变为状态响应式更新,更清晰、调试更友好。

// store.ts
export const useUserStore = defineStore('user', {state: () => ({ name: '' }),actions: {updateName(newName) {this.name = newName}}
})

组件中调用:

const userStore = useUserStore()
userStore.updateName('余华杰')

3. provide/inject:祖先组件向后代传递共享值

适合“组件树中但非直接父子”的通信场景。

// 父组件
provide('theme', 'dark')// 孙组件
const theme = inject('theme')

六、Vue3 对事件总线的最终态度

Vue3 核心团队对事件总线的态度可以总结为一句话:

事件总线是一个权宜之计,而不是长期可维护的架构选择。


七、总结:Vue3 开发者如何理解 Vue2 的事件总线?

对比维度Vue2 事件总线Vue3 推荐机制
核心机制基于组件实例事件系统mitt、pinia、emit、inject
是否推荐适用于小项目,已过时✅ 推荐现代方式
可维护性❌ 差✅ 好
状态支持❌ 仅传递数据✅ 响应式状态
类型支持❌ 较差✅ 可用 TypeScript 定义

八、写给 Vue3 开发者的一句话建议

如果你在 Vue3 项目中还在考虑用“事件总线”,说明你的架构还有优化空间。请使用更清晰、更现代、更类型安全的通信方式。

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

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

相关文章

CSS结构性伪类、UI伪类与动态伪类全解析:从文档结构到交互状态的精准选择

一、结构性伪类选择器:文档树中的位置导航器 结构性伪类选择器是CSS中基于元素在HTML文档树中的层级关系、位置索引或结构特征进行匹配的一类选择器。它们无需依赖具体的类名或ID,仅通过文档结构即可精准定位元素,是实现响应式布局和复杂文档…

【SSL证书系列】SSL证书工作原理解读

SSL(Secure Sockets Layer)及其继任者TLS(Transport Layer Security)是用于保护网络通信安全的加密协议。SSL证书是实现HTTPS协议的核心,其工作原理涉及加密技术、身份验证和信任机制。以下是其工作原理的详细分步解析…

第二十四天打卡

import os os.getcwd() os.listdir() path_a r"C:\Users\renshuaicheng\Documents" path_b "MyProjectData" file "results.csv" file_path os.path.join(path_a,path_b,file) file_path import osstart_directory os.getcwd() # 假设这个目…

【CUDA】Sgemm单精度矩阵乘法(下)

目录 前言1. 优化技巧5:使用register模拟二级缓存(内积转外积)2. 优化技巧6:使用register模拟二级缓存 float43. 优化技巧7:global memory转置再存放shared memory4. 优化技巧8:使用double buffer加速矩阵…

【1000以内具有12个以上因子的整数并输出它的因子】2021-12-27

缘由c语言输入1000以内具有12个以上因子的整数 并输出它的因子-编程语言-CSDN问答 int 求因子个数(int 数, int* 因子 { 0 }) {//缘由https://bbs.csdn.net/topics/399168406int 和 0, 求 1, 商 0, 含 0;//因子不含1和数本身while (求 < (商 数 / 求))if (!(数 % 求)…

C#中的dynamic与var:看似相似却迥然不同

在C#编程的世界里&#xff0c;var和dynamic这两个关键字常常让初学者感到困惑。它们看起来都在定义变量时省略了显式类型声明&#xff0c;但实际上它们的工作方式和应用场景有着天壤之别。今天&#xff0c;让我们一起揭开这两个关键字的神秘面纱。 var&#xff1a;编译时的类型…

流速仪数据处理及流量断面线绘制

1 需求描述 在实际航道测量项目中&#xff0c;有测量断面线流量流速的需求&#xff0c;得使用流速仪在现场进行测量&#xff0c;相关操作在之前已经写了记录。本次手册记录后期数据处理与流量线绘制&#xff0c;以该区域为例。 流速仪设备操作说明 2 规范要求 3 流量断面表格…

购物车构件示例

通用购物车构件设计 注:代码仅用于演示原理,不可用于生产环境。 一、设计目标 设计一个高度可复用的购物车构件,具备以下特点: 与具体业务系统解耦支持多种应用场景(商城、积分系统等)提供标准化接口易于集成和扩展二、核心架构设计 1. 分层架构 ┌─────────…

数据结构·字典树

字典树trie 顾名思义&#xff0c;在一个字符串的集合里查询某个字符串是否存在树形结构。 树存储方式上用的是结构体数组&#xff0c;类似满二叉树的形式。 模板 定义结构体和trie 结构体必须的内容&#xff1a;当前结点的字符&#xff0c;孩子数组可选&#xff1a;end用于查…

ES面试题系列「一」

1、Elasticsearch 是什么&#xff1f;它与传统数据库有什么区别&#xff1f; 答案&#xff1a;Elasticsearch 是一个基于 Lucene 的分布式、开源的搜索和分析引擎&#xff0c;主要用于处理大量的文本数据&#xff0c;提供快速的搜索和分析功能。与传统数据库相比&#xff0c;E…

2025年6月一区SCI-不实野燕麦优化算法Animated Oat Optimization-附Matlab免费代码

引言 近年来&#xff0c;在合理框架内求解优化问题的元启发式算法的发展引起了全球科学界的极大关注。本期介绍一种新的元启发式算法——不实野燕麦优化算法Animated Oat Optimization algorithm&#xff0c;AOO。该算法模拟了不实野燕麦的3种独特行为&#xff0c;于2025年6月…

Agent Builder API - Agent Smith 扩展的后端服务(开源代码)

​一、软件介绍 文末提供程序和源码下载 Agent Builder API - Agent Smith 扩展的后端服务&#xff08;开源代码&#xff09;手动设置&#xff1a;在本地计算机中克隆此存储库并启动 python FAST API 服务器。&#xff08;可选&#xff09;安装并设置 Mongo DB。Dev Container…

C及C++的SOAP协议库

一.gSOAP gSOAP 是一个功能强大的开源工具包&#xff0c;专为 C 和 C 设计&#xff0c;用于快速开发基于 SOAP 协议的 Web 服务和客户端。 1.协议支持 SOAP 版本&#xff1a;完整支持 SOAP 1.1/1.2 规范&#xff0c;包括消息格式、编码规则和错误处理。 传输协议&#xff1a…

html5+css3实现傅里叶变换的动态展示效果(仅供参考)

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>傅里叶变换的动态展示效果</title><sty…

ECharts中Map(地图)样式配置、渐变色生成

前言 在日常开发中&#xff0c;ECharts 几乎成了我们绘制数据图表的标配工具&#xff0c;功能强大到几乎无所不能。不过每次用的时候都要翻官方文档查配置项&#xff0c;确实有点小繁琐 &#x1f605; 为了提升效率&#xff0c;也方便以后快速复用&#xff0c;这里就整理记录…

内存分配器ptmalloc2、tcmalloc、jemalloc,结构设计、内存分配过程详解

1. 引言 博主之前做过一个高并发内存池的项目实践&#xff0c;在实践中对于内存分配器的内存分配过程理解更加深刻了。在此期间&#xff0c;翻查了不少资料以及博客&#xff0c;发现源码分享的博客不多&#xff0c;能生动完整的讲述ptmalloc2、tcmalloc、jemalloc它们的结构设…

【拥抱AI】Deer-Flow字节跳动开源的多智能体深度研究框架

最近发现一款可以对标甚至可能超越GPT-Researcher的AI深度研究应用&#xff0c;Deer-Flow&#xff08;Deep Exploration and Efficient Research Flow&#xff09;作为字节跳动近期开源的重量级项目&#xff0c;正以其模块化、灵活性和人机协同能力引发广泛关注。该项目基于 La…

openfeign与dubbo调用下载excel实践

一、前言 openfeign和dubbo均是rpc框架 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;框架 是一种允许程序像调用本地方法一样调用远程服务器上函数的技术。它隐藏了底层网络通信的复杂性&#xff0c;让开发者可以专注于业务逻辑&#xff0c;实现…

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-强化学习算法

解密企业级大模型智能体Agentic AI 关键技术&#xff1a;MCP、A2A、Reasoning LLMs-强化学习算法 现在我们的核心问题是有一些同学会知道要才能强化学习。为什么才能强化学习&#xff1f;是实现AGI。例如从这个其实你从第一阶段开始以后&#xff0c;就是chatbot&#xff0c;这…

音频分类的学习

1.深度学习PyTorch入门-语音分类 https://blog.csdn.net/sinat_41787040/article/details/129795496 https://github.com/musikalkemist/pytorchforaudio https://github1s.com/musikalkemist/pytorchforaudio/blob/main/04%20Creating%20a%20custom%20dataset/urbansoundda…