Mitt 事件發射器完全指南:200字節的輕量級解決方案

簡介

Mitt 是一個輕量級的事件發射器庫,體積小巧(約 200 字節),無依賴,支持 TypeScript。它提供了簡單而強大的事件發布/訂閱機制,適用于組件間通信、狀態管理等場景。

特點

  • 🚀 超輕量級(~200 bytes)
  • 🔧 無依賴
  • 📝 TypeScript 支持
  • 🎯 簡單易用的 API
  • 🛡? 類型安全

安裝

npm install mitt

基本用法

創建事件發射器

import mitt from "mitt";// 創建事件發射器實例
const emitter = mitt();// 或者指定事件類型
type Events = {foo: string;bar: number;baz: void;
};const typedEmitter = mitt<Events>();

監聽事件

// 監聽單個事件
emitter.on("foo", (data) => {console.log("收到 foo 事件:", data);
});// 監聽多個事件
emitter.on("bar", (data) => {console.log("收到 bar 事件:", data);
});// 使用通配符監聽所有事件
emitter.on("*", (type, data) => {console.log(`事件類型: ${type}, 數據:`, data);
});

發射事件

// 發射事件(無數據)
emitter.emit("baz");// 發射事件(帶數據)
emitter.emit("foo", "hello world");
emitter.emit("bar", 42);

移除監聽器

// 移除特定事件的監聽器
emitter.off("foo");// 移除所有監聽器
emitter.all.clear();// 移除特定監聽器(需要保存引用)
const handler = (data: string) => console.log(data);
emitter.on("foo", handler);
emitter.off("foo", handler);

API 詳解

mitt()

創建一個新的事件發射器實例。

const emitter = mitt<Events>();

emitter.on(type, handler)

注冊事件監聽器。

參數:

  • type: 事件類型(字符串或通配符 ‘*’)
  • handler: 事件處理函數

返回值:?無

emitter.on("message", (data: string) => {console.log("收到消息:", data);
});

emitter.off(type, handler?)

移除事件監聽器。

參數:

  • type: 事件類型
  • handler: 可選的特定處理函數

返回值:?無

// 移除所有 'message' 事件的監聽器
emitter.off("message");// 移除特定的監聽器
const handler = (data: string) => console.log(data);
emitter.off("message", handler);

emitter.emit(type, data?)

發射事件。

參數:

  • type: 事件類型
  • data: 可選的事件數據

返回值:?無

emitter.emit("message", "Hello World");
emitter.emit("notification");

emitter.all

獲取所有注冊的事件監聽器。

// 查看所有事件類型
console.log(Object.keys(emitter.all));// 清空所有監聽器
emitter.all.clear();

高級特性

通配符監聽

// 監聽所有事件
emitter.on("*", (type, data) => {console.log(`事件 ${type} 被觸發:`, data);
});// 通配符監聽器會收到事件類型作為第一個參數
emitter.emit("foo", "bar");
// 輸出: 事件 foo 被觸發: bar

鏈式調用

// 支持鏈式調用
emitter.on("event1", () => console.log("event1")).on("event2", () => console.log("event2")).emit("event1");

常見用例

React 組件間通信

// 創建全局事件發射器
export const globalEmitter = mitt<{themeChange: "light" | "dark";userUpdate: { id: string; name: string };
}>();// 在組件中使用
function ThemeToggle() {const toggleTheme = () => {globalEmitter.emit("themeChange", "dark");};return <button onClick={toggleTheme}>切換主題</button>;
}function UserProfile() {useEffect(() => {const handler = (user: { id: string; name: string }) => {console.log("用戶信息更新:", user);};globalEmitter.on("userUpdate", handler);return () => globalEmitter.off("userUpdate", handler);}, []);return <div>用戶資料</div>;
}

Vue 3 組合式 API

// composables/useEventBus.ts
import mitt from "mitt";
import { onUnmounted } from "vue";export const eventBus = mitt();export function useEventBus() {const handlers: Array<() => void> = [];const on = (event: string, handler: Function) => {eventBus.on(event, handler);handlers.push(() => eventBus.off(event, handler));};const emit = (event: string, data?: any) => {eventBus.emit(event, data);};onUnmounted(() => {handlers.forEach((cleanup) => cleanup());});return { on, emit };
}// 在組件中使用
export default {setup() {const { on, emit } = useEventBus();on("message", (data: string) => {console.log("收到消息:", data);});const sendMessage = () => {emit("message", "Hello from component");};return { sendMessage };},
};

注意事項

內存泄漏

  • 始終在組件卸載時清理事件監聽器
  • 使用?emitter.all.clear()?清空所有監聽器
  • 保存處理函數引用以便精確移除

事件循環

  • 避免在事件處理函數中發射相同事件
  • 使用防抖或節流處理高頻事件
  • 考慮使用?setTimeout?或?setImmediate?延遲事件發射

調試技巧

// 開發環境下的調試輔助
if (process.env.NODE_ENV === "development") {const originalEmit = emitter.emit;emitter.emit = (type, data) => {console.log(`[Event] ${type}:`, data);originalEmit.call(emitter, type, data);};
}

Mitt 是一個簡單而強大的事件發射器,通過合理使用可以大大簡化組件間通信和狀態管理。掌握這些用法和最佳實踐,將幫助您構建更加健壯和可維護的應用程序。

?Mitt 事件發射器完全指南:200字節的輕量級解決方案 - 高質量源碼分享平臺-免費下載各類網站源碼與模板及前沿技術分享

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

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

相關文章

數據庫鎖與死鎖-筆記

一、概述 數據庫是一個共享資源,可以供給多個用戶使用。運行多個用戶同時使用一個數據庫的數據系統統稱多用戶數據庫系統。例如,飛機訂票數據庫系統。在這樣的一個系統中,在同一時刻并發運行的事務數可達數百上千個。 當多個用戶并發地存取數據庫時就會產生多個事務同時存…

滲透藝術系列之Laravel框架(二)

任何軟件&#xff0c;都會存在安全漏洞&#xff0c;我們應該將攻擊成本不斷提高&#xff01;?**——服務容器與中間件的攻防博弈**?本文章僅提供學習&#xff0c;切勿將其用于不法手段&#xff01;一、服務容器的"依賴注入陷阱"1.1 接口綁定的"影子服務"…

官網SSO登錄系統的企業架構設計全過程

第一階段&#xff1a;架構愿景與業務架構設計 (Architecture Vision & Business Architecture) 任何架構的起點都必須是業務目標和需求。 1.1 核心業務目標 (Business Goals) 提升用戶體驗&#xff1a;用戶一次登錄&#xff0c;即可無縫訪問集團下所有子公司的官網和應用&a…

2025世界機器人大會:中國制造“人形時代”爆發

2025世界機器人博覽會8月8日在北京亦莊開幕&#xff0c;主題為“讓機器人更智慧&#xff0c;讓具身體更智能”&#xff0c;匯聚全球200余家企業、1500余件展品&#xff0c;其中首發新品超100款&#xff0c;人形機器人整機企業參展數量創同類展會之最。 除了機器人本體外&#…

Oracle 庫定期備份表結構元數據信息至目標端備份腳本

一、背景描述當前 xxx 項目 Oracle 11g RAC 庫缺少 DG&#xff0c;并且日常沒有備份&#xff0c;存在服務器或存儲損壞&#xff0c;數據或表結構存在丟失風險&#xff0c;在和項目組同步后&#xff0c;項目組反饋可對該數據庫定期備份相關結構信息&#xff0c;如存在數據丟失&a…

wps安裝后win系統瀏覽窗口無法查看

前提需要有安裝office軟件&#xff0c;PDF一般默認是瀏覽器&#xff0c;如果設置瀏覽器不行&#xff0c;就安裝Adobe Acrobat DC軟件1、按winR鍵&#xff0c;輸入regedit&#xff0c;進入注冊表2、找到路徑&#xff1a;\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Current…

Qt 中最經典、最常用的多線程通信場景

實現步驟創建工作類 (Worker)&#xff1a;在工作線程中處理數據的對象。創建線程對象 (QThread)&#xff1a;用來托管工作對象。連接信號槽&#xff1a;主線程 -> 工作線程&#xff1a;連接一個主窗口發出的信號到工作對象的槽&#xff0c;用于傳遞數據。工作線程 -> 主線…

【CV 目標檢測】Fast RCNN模型①——與R-CNN區別

3.Fast RCNN模型 相比于R-CNN&#xff0c;Fast RCNN模型主要在以下三個方面進行了改進&#xff1a; 提高訓練和預測速度 R-CNN首先從測試圖中提取2000個候選區域&#xff0c;然后將這2000個候選區域分別輸入到預訓練好的CNN中提取特征。由于候選區域有大量的重疊&#xff0c;這…

Zookeeper學習

要精通 ZooKeeper&#xff0c;需要掌握其核心原理、數據模型、分布式協調機制、典型應用場景、運維管理與性能調優等方面的知識。以下是系統化的知識體系&#xff1a;? 一、ZooKeeper 基礎原理ZooKeeper 是什么 分布式協調服務&#xff0c;提供一致性、高可用的元數據管理核心…

用TestComplete打造高效CI/CD測試流程

傳統的UI測試往往受限于圖形界面渲染&#xff0c;導致執行速度慢、資源占用高&#xff0c;難以適應持續集成/持續交付&#xff08;CI/CD&#xff09;管道的需求。自動化UI測試平臺TestComplete的智能質量附加組件通過無頭測試技術&#xff0c;為開發團隊提供了一種更高效、更可…

C++ 淺拷貝 和深拷貝的知識點講解

好問題 &#x1f44d;&#xff0c;這個就是理解 delete 的關鍵前置知識。 我從 C語言基礎 出發&#xff0c;像教科書一樣&#xff0c;從零講給你聽。1. 什么是“拷貝”&#xff1f; 在 C 中&#xff0c;當你有一個對象 A&#xff0c;然后寫&#xff1a; Device_Info a; Device…

Arkts加載網頁url的pdf發票黑屏問題

使用模擬器會閃退&#xff0c;連接真機預覽正常import { HMRouter, HMRouterMgr, HMParamType, HMPageParam } from "hadss/hmrouter"; import { BaseTitle, RouterConstants } from "commonlib"; import { webview } from kit.ArkWeb; import { PDFView }…

使用 mongosh 設置 MongoDB 賬號密碼

可以使用 mongosh(MongoDB 6.0+ 的現代Shell)來設置賬號密碼。mongosh 是官方推薦的新一代MongoDB Shell工具,替代了傳統的 mongo 命令。 【本人博文提到的ip均為隨機生成的,不是實際的ip,僅供參考,如有雷同,純屬巧合】 使用 mongosh 設置 MongoDB 賬號密碼 1. 首先連…

HTML+CSS:浮動詳解

在HTMLCSS布局中&#xff0c;浮動&#xff08;float&#xff09; 是一種經典的布局技術&#xff0c;用于控制元素在頁面中的排列方式。它最初設計用于實現文字環繞圖片的效果&#xff0c;后來被廣泛用于復雜布局&#xff0c;但隨著Flexbox和Grid的興起&#xff0c;其使用場景有…

GPIO初始化及調用

下面把 HAL 庫 和 標準外設庫&#xff08;SPL&#xff09; 初始化 GPIO 點亮/熄滅 LED 的完整步驟、示例代碼和常用 API 逐一說清楚。用例默認 PC13 接 LED&#xff08;藍板常見&#xff1b;低電平點亮&#xff0c;高電平熄滅——若板子相反&#xff0c;只把寫 1/0 對調即可&am…

【GPT入門】第48課 LlamaFacotory 合并原模型與LoRA模型

【GPT入門】第48課 LlamaFacotory 合并原模型與LoRA模型1.合并原模型與LoRA訓練的增量模型2. 測試模型1.合并原模型與LoRA訓練的增量模型 llamafactory-cli webui 執行合并 合并后模型大小 (base) rootautodl-container-b4b04ea4f2-b5ee47d1:~# du -sh /root/autodl-tmp/mod…

Python爬蟲實戰:研究tumblr,構建博客平臺數據采集分析系統

1. 引言 1.1 研究背景 在信息爆炸的時代,社交媒體平臺已成為人們獲取信息、表達觀點和進行社交互動的主要渠道。這些平臺上積累的海量數據包含了用戶偏好、社會趨勢、文化現象等豐富信息,對學術研究、市場分析、產品開發等領域具有重要價值。 Tumblr 作為一個綜合性的輕博客…

集成算法學習總結

一、集成學習基礎認知 核心思想&#xff1a;集成學習&#xff08;ensemble learning&#xff09;通過構建并結合多個個體學習器來完成學習任務&#xff0c;類似于 “多個專家共同決策”&#xff0c;通常比單個學習器的性能更優。其核心邏輯是利用多個學習器的優勢互補&#xff…

線程安全的產生以及解決方案

線程安全原子性&#xff08;Atomicity&#xff09;、可見性&#xff08;Visibility&#xff09;、有序性&#xff08;Ordering&#xff09; 是保證線程安全的三大核心要素 —— 線程安全問題的本質&#xff0c;幾乎都是這三個特性中的一個或多個被破壞導致的。操作不會被 “中途…

Spring Cloud Netflix學習筆記01

文章目錄前言一、微服務概述什么是微服務&#xff1f;微服務與微服務架構微服務優缺點優點缺點微服務技術棧有那些&#xff1f;二.SpringCloud入門概述SpringCloud是什么&#xff1f;SpringCloud和SpringBoot的關系Dubbo 和 SpringCloud技術選型總結SpringCloud能干嘛&#xff…