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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…