-
Mitt类设计
-
emitter属性:用于存储事件和对应的处理器
-
on方法:订阅事件
-
off方法:取消订阅事件
-
emit方法:触发事件
export class Mitt<T> {private readonly emitter: Record<string, Array<(value: T[keyof T]) => void>> = {};/*** 订阅事件* @param eventName 事件名称,应为T的属性名* @param cb 事件处理函数*/on(eventName : string, cb : ( value : T[keyof T]) => void ) {this.emitter[eventName] ? this.emitter[eventName].push(cb) : this.emitter[eventName] = [cb];}/*** 取消订阅事件* @param eventName 事件名称,应为T的属性名* @param cb 事件成功回调*/off(eventName: string, cb?: () => void): void {delete this.emitter[eventName];if (cb) { cb(); }}/*** 取消所有订阅事件*/offAll() {Object.keys(this.emitter).forEach(key => {delete this.emitter[key];});}/*** 发布事件* @param eventName 事件名称,应为T的属性名* @param value 事件参数*/emit(eventName : string, value : any) {if (this.emitter[eventName]) {this.emitter[eventName].forEach(cb => cb(value));}}}
-
使用Mitt实例
-
创建Mitt实例:实例化Mitt类
-
订阅事件:调用on方法订阅事件
-
触发事件:调用emit方法触发事件
-
取消订阅:调用off方法取消订阅
import { Mitt } from "@/utils/Mitt";let mitt = new Mitt();mitt.emit("test", [1,2,3,4]);mitt.on("test", (data: []) => {console.log(data);});setTimeout(() => {mitt.off("test", () => {console.log("取消了");});},30000);
提示:off方法的回调参数是可选的,如果提供,会在取消订阅后执行。