当前位置: 首页 > news >正文

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.dtcms.com/a/335448.html

相关文章:

  • Git 命令指南:从 0 到熟练、从常用到“几乎全集”(含常见报错与解决)建议收藏!!!
  • Leetcode 深度优先搜索 (2)
  • Java多线程进阶-JUC之ReentrantLock与Callable
  • Oracle algorithm的含义
  • 【牛客刷题】01字符串按递增长度截取并转换为十进制数值
  • 26. 值传递和引用传递的区别的什么?为什么说Java中只有值传递
  • 告别“测试滞后”:AI实时测试工具在敏捷开发中的落地经验
  • 【JavaEE】多线程 -- 单例模式
  • 基于Python的情感分析与情绪识别技术深度解析
  • 锂电池SOH预测 | Matlab基于KPCA-PLO-Transformer-LSTM的的锂电池健康状态估计(锂电池SOH预测),附锂电池最新文章汇集
  • CVPR2 2025丨大模型创新技巧:文档+语音+视频“大模型三件套”
  • 音频分类标注工具
  • 91.解码方法
  • GaussDB 数据库架构师修炼(十三)安全管理(5)-全密态数据库
  • 17.5 展示购物车缩略信息
  • JMeter(进阶篇)
  • 3D打印——给开发板做外壳
  • 蓝凌EKP产品:JSP 性能优化和 JSTL/EL要点检查列表
  • Trae 辅助下的 uni-app 跨端小程序工程化开发实践分享
  • Docker之自定义jkd镜像上传阿里云
  • Spring AI 集成阿里云百炼平台
  • vscode无法检测到typescript环境解决办法
  • SpringCloud 03 负载均衡
  • 向量数据库基础和实践 (Faiss)
  • QT 基础聊天应用项目文档
  • Flutter vs Pygame 桌面应用开发对比分析
  • Android原生(Kotlin)与Flutter混合开发 - 设备控制与状态同步解决方案
  • 安卓开发者自学鸿蒙开发2页面高级技巧
  • 第一阶段总结:你的第一个3D网页
  • 【牛客刷题】成绩统计与发短信问题详解