從 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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80996.shtml
英文地址,請注明出處:http://en.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…