Vue 3 事件總線詳解:構建組件間高效通信的橋梁

Vue 3 事件總線詳解:構建組件間高效通信的橋梁

    • 為什么需要事件總線?
    • 使用 mitt 實現事件總線
      • 1. 安裝 mitt
      • 2. 創建事件總線
      • 3. 在組件中使用事件總線
        • 發送端組件(例如 ComponentA.vue)
        • 接收端組件(例如 ComponentB.vue)
    • 自定義實現事件總線
    • 總結

在復雜的前端應用中,組件之間的通信往往需要一種靈活且解耦的方式。傳統的 Vue 2 中,我們常使用全局事件總線來實現這種通信,但在 Vue 3 中,由于架構和 API 的變化,全局事件總線并非內置方案。本文將為你詳細介紹如何在 Vue 3 中實現事件總線,并通過代碼示例展示基于 mitt 的輕量級事件總線實現,以及自定義實現的方法。


為什么需要事件總線?

在組件間通信場景中,當組件之間沒有直接的父子關系時,我們可以通過事件總線來實現數據傳遞。事件總線能夠實現以下效果:

  • 解耦合通信: 發送者與接收者無需相互依賴,只需關注事件名稱與數據內容。
  • 靈活擴展: 對于簡單的跨組件通信需求,不必引入狀態管理庫(如 Vuex/Pinia)。
  • 簡化代碼邏輯: 通過統一的事件中轉,便于維護與調試。

使用 mitt 實現事件總線

mitt 是一個僅 200 行左右代碼的極簡事件觸發器,非常適合用作 Vue 3 的事件總線。

1. 安裝 mitt

首先,通過 npm 或 yarn 安裝 mitt:

# 使用 npm 安裝
npm install mitt# 或者使用 yarn
yarn add mitt

2. 創建事件總線

在項目中創建一個單獨的事件總線文件,如 eventBus.js

// eventBus.js
import mitt from 'mitt'const emitter = mitt()export default emitter

3. 在組件中使用事件總線

發送端組件(例如 ComponentA.vue)
<template><div><h2>組件 A</h2><button @click="sendMessage">發送消息</button></div>
</template><script setup>
import emitter from '@/eventBus'  // 根據項目實際路徑引入const sendMessage = () => {// 觸發事件 'custom-event',傳遞消息數據emitter.emit('custom-event', 'Hello from Component A')
}
</script>
接收端組件(例如 ComponentB.vue)
<template><div><h2>組件 B</h2><p>收到的消息:{{ message }}</p></div>
</template><script setup>
import { ref, onMounted, onUnmounted } from 'vue'
import emitter from '@/eventBus'const message = ref('')// 定義事件處理函數
const updateMessage = (payload) => {message.value = payload
}onMounted(() => {// 監聽 'custom-event' 事件emitter.on('custom-event', updateMessage)
})onUnmounted(() => {// 組件銷毀時注銷事件監聽,避免內存泄漏emitter.off('custom-event', updateMessage)
})
</script>

通過上述代碼示例,我們實現了組件間的簡單通信:當 ComponentA 中點擊按鈕時,會通過事件總線發送消息;而 ComponentB 監聽到該消息后,自動更新顯示的內容。


自定義實現事件總線

除了使用 mitt,還可以基于 Vue 3 的響應式 API 自行構造一個簡單的事件總線。以下為一個簡單的實現示例:

// customEventBus.js
import { reactive } from 'vue'const eventBus = reactive({events: {},// 監聽事件on(event, callback) {if (!this.events[event]) {this.events[event] = []}this.events[event].push(callback)},// 觸發事件emit(event, payload) {if (this.events[event]) {this.events[event].forEach(callback => callback(payload))}},// 注銷事件off(event, callback) {if (this.events[event]) {this.events[event] = this.events[event].filter(cb => cb !== callback)}}
})export default eventBus

使用方法與 mitt 類似,在組件中引入 customEventBus,進行事件監聽與觸發即可。


總結

本文介紹了 Vue 3 中實現事件總線的兩種方式:

  • 使用輕量級庫 mitt 實現高效解耦的事件通信;
  • 基于 Vue 3 響應式 API 自定義一個簡單的事件總線。

事件總線對于非父子組件間的通信場景十分適用,但在大型應用中,建議結合狀態管理方案(如 Pinia 或 Vuex)進行更系統化的數據管理。希望這篇文章能幫助你更好地理解并應用 Vue 3 中的事件總線,為組件間通信搭建高效橋梁!


快試試以上代碼示例,體驗 Vue 3 中事件總線帶來的靈活與便捷吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899731.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899731.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899731.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL的基礎語法1(增刪改查、DDL、DML、DQL和DCL)

目錄 一、基本介紹 二、SQL通用語法 三、SQL分類(DDL、DML、DQL、DCL) 1.DDL 1.1數據庫操作 1.2表操作 1.2.1表操作-查詢創建 1.2.2表操作-數據類型 1&#xff09;數值類型 2&#xff09;字符串類型 3&#xff09;日期時間類型?編輯 4&#xff09;表操作-案例 1.2.3…

【NLP】15. NLP推理方法詳解 --- 動態規劃:序列標注,語法解析,共同指代

動態規劃 (Dynamic Programming) 動態規劃&#xff08;Dynamic Programming&#xff0c;簡稱 DP&#xff09;是一種通過將問題分解為較小子問題來優化計算效率的技術。它特別適用于優化最優解問題&#xff0c;比如序列標注&#xff08;sequence tagging&#xff09;這類任務。…

JavaScript中的NaN、undefined和null 的區別

NaN代表"Not a Number",它是一種特殊的數值,用于表示非數字值。當一個操作無法返回有效的數值時,通常會得到NaN作為結果。 let result = 10 / abc; console.log(result); // 輸出 NaN需要注意的是,NaN與自身不相等,我們無法通過簡單的比較操作符(如==或===)來…

Turtle事件處理(鍵盤與鼠標交互)

Turtle 提供了 事件驅動編程,允許我們使用 鍵盤 和 鼠標 控制 Turtle,從而實現交互式繪圖。例如,我們可以讓 Turtle 響應 按鍵、鼠標點擊 和 拖動 事件,使其根據用戶的輸入進行移動、旋轉或繪制圖形。 1. 事件機制概述 Turtle 的事件處理主要依賴 turtle.Screen() 提供的 …

【Keepalived】Keepalived-2.3.3明確結束對CentOS 7的支持

2025年3月30日&#xff0c;官方發布了Keepalived的最新版&#xff0c;版本號&#xff1a;2.3.3 而2024年11月3日發布的2.3.2版本&#xff0c;在CentOS 7.9上編譯的時候&#xff0c;就出現了報錯&#xff0c;但是在Alma Linux 8.10上&#xff0c;則可以成功編譯安裝&#xff0c…

PyTorch --torch.cat張量拼接原理

在 PyTorch 的 torch.cat 函數中&#xff0c;out 參數用于指定輸出張量的存儲位置。是否使用 out 參數直接影響結果的存儲方式和張量的內存行為。以下是詳細解釋&#xff1a; 不使用 out 參數&#xff08;默認行為&#xff09; 含義&#xff1a;不提供 out 參數時&#xff0c;…

人工智能之數學基礎:矩陣對角化的本質

本文重點 前面的課程中,我們學習了矩陣的對角化,基于對角化可以將矩陣A轉變為對角矩陣D,但是你有沒有想過,為什么要進行矩陣對角化,矩陣對角化究竟做了一件什么事情呢? 矩陣對角化的本質 幾何解釋: 從幾何變換的角度看,矩陣對角化意味著我們找到了一組基,使得線性變…

ubuntu的ubuntu--vg-ubuntu--lv磁盤擴容

在我們安裝ubuntu時&#xff0c;如果選擇的是自動分區&#xff0c;就會按照邏輯卷的形式來分區&#xff0c;并且只分配100G其余的并不會被分配&#xff0c;這對我們大多數情況來說都是不合理的&#xff0c;所以&#xff0c;如何擴充呢 下面以一個小的案例來說明如何擴充 問題…

Redis BitMap 實現簽到及連續簽到統計

一、引言 用戶簽到功能是很多應用都離不開的一個板塊&#xff0c;單詞打開、QQ達人等等為我們所熟知&#xff0c;這項功能該如何實現呢&#xff0c;一些朋友可能想當然的覺得無非將每日的簽到數據記錄下來不就好了&#xff0c;不會去細想用誰記錄&#xff0c;如何記錄才合適。 …

前端國際化-插件模式

文章目錄 Webpack 插件開發解析中文調用有道翻譯 API生成 JSON 語言文件React 國際化實現 Webpack 插件開發 創建 i18n-webpack-plugin.js 插件&#xff1a;在 src 目錄下掃描所有文件使用 babel-parser 解析 JavaScript/JSX 代碼識別中文文本通過有道翻譯 API 翻譯生成 local…

IP屬地和發作品的地址不一樣嗎

在當今這個數字化時代&#xff0c;互聯網已經成為人們日常生活不可或缺的一部分。隨著各大社交平臺功能的不斷完善&#xff0c;一個新功能——IP屬地顯示&#xff0c;逐漸走進大眾視野。這一功能在微博、抖音、快手等各大平臺上得到廣泛應用&#xff0c;旨在幫助公眾識別虛假信…

PP-ChatOCRv3新升級:多頁PDF信息抽取支持自定義提示詞工程,拓展大語言模型功能邊界

文本圖像信息抽取技術在自動化辦公、建筑工程、教育科研、金融風控、醫療健康等行業領域具有廣泛應用場景。2024年9月&#xff0c;飛槳低代碼開發工具PaddleX中新增文本圖像智能產線PP-ChatOCRv3&#xff0c;充分結合PaddleOCR的文本圖像版面解析能力和文心一言語言理解優勢&am…

算法刷題記錄——LeetCode篇(1.2) [第11~20題](持續更新)

更新時間&#xff1a;2025-03-29 LeetCode題解專欄&#xff1a;實戰算法解題 (專欄)技術博客總目錄&#xff1a;計算機技術系列目錄頁 優先整理熱門100及面試150&#xff0c;不定期持續更新&#xff0c;歡迎關注&#xff01; 17. 電話號碼的字母組合 給定一個僅包含數字 2-9…

如何在 vue 渲染百萬行數據,vxe-table 渲染百萬行數據性能對比,超大量百萬級表格渲染

vxe-table 渲染百萬行數據性能對比&#xff0c;超大量百萬級表格渲染&#xff1b;如何在 vue 渲染百萬行數據&#xff1b;當在開發項目時&#xff0c;遇到需要流暢支持百萬級數據的表格時&#xff0c; vxe-table 就可以非常合適了&#xff0c;不僅支持強大的功能&#xff0c;虛…

阿里 FunASR 開源中文語音識別大模型應用示例(準確率比faster-whisper高)

文章目錄 Github官網簡介模型安裝非流式應用示例流式應用示例 Github https://github.com/modelscope/FunASR 官網 https://www.funasr.com/#/ 簡介 FunASR是一個基礎語音識別工具包&#xff0c;提供多種功能&#xff0c;包括語音識別&#xff08;ASR&#xff09;、語音端…

如何使用 LLaMA-Factory 微調 LLaMA3

【LLaMa3微調】使用 LLaMA-Factory 微調LLaMA3 實驗環境 1.1 機器 操作系統&#xff1a;Windows 10 或 UbuntuPyTorch 版本&#xff1a;2.1.0Python 版本&#xff1a;3.10&#xff08;針對Ubuntu 22.04&#xff09;Cuda 版本&#xff1a;12.1GPU 配置&#xff1a;p100 (16GB) …

使用Java ApI 實現Hadoop文件上傳

目錄 文件傳輸步驟 windows的本機文件傳輸 linux的虛擬機文件傳輸 文件傳輸步驟 建立連接 在connect2HDFS()方法中&#xff0c;通過設置Configuration對象來指定HDFS的URI&#xff08;在這個例子中為hdfs://192.168.12.133:9000&#xff09;&#xff0c;并初始化一個FileSys…

喜訊 | 耘瞳科技視覺檢測與測量裝備榮膺“2024機器視覺創新產品TOP10”

3月28日&#xff0c;全球機器視覺行業盛會VisionChina2025&#xff08;上海&#xff09;機器視覺展完美收官。展會期間&#xff0c;由機器視覺產業聯盟&#xff08;CMVU&#xff09;舉辦的“2024機器視覺創新產品TOP10”企業名單正式揭曉&#xff0c;耘瞳科技“工業跨尺度場景實…

數據可視化(matplotlib)-------圖表樣式美化

目錄 一、圖表樣式概述 &#xff08;一&#xff09;、默認圖表樣式 &#xff08;二&#xff09;、圖表樣式修改 1、局部修改 2、全局修改 二、使用顏色 &#xff08;一&#xff09;、使用基礎顏色 1、單詞縮寫或單詞表示的顏色 2、十六進制/HTML模式表示的顏色 3、RGB…

202518 | Ngnix

Ngnix是什么 Nginx&#xff08;發音為“engine-x”&#xff09;是一個開源的高性能HTTP服務器、反向代理服務器、負載均衡器和郵件代理服務器。它由俄羅斯程序員Igor Sysoev開發&#xff0c;首次發布于2004年&#xff0c;旨在解決C10K問題&#xff08;即如何高效地處理10,000個…