微信小程序 EventEmitter.js on emit off once
// utils/EventEmitter.js
class EventEmitter {
constructor() {
this.events = {};
}
// 监听事件
on(eventName, callback) {
if (!this.events[eventName]) {
this.events[eventName] = [];
}
this.events[eventName].push(callback);
}
// 取消监听
off(eventName, callback) {
if (!this.events[eventName]) return;
if (!callback) {
// 如果没有传入回调,则移除该事件的所有监听
delete this.events[eventName];
} else {
// 移除特定的回调
this.events[eventName] = this.events[eventName].filter(
cb => cb !== callback
);
// 如果没有回调了,删除该事件
if (this.events[eventName].length === 0) {
delete this.events[eventName];
}
}
}
// 触发事件
emit(eventName, ...args) {
if (!this.events[eventName]) return;
this.events[eventName].forEach(callback => {
callback(...args);
});
}
// 一次性监听
once(eventName, callback) {
const onceWrapper = (...args) => {
callback(...args);
this.off(eventName, onceWrapper);
};
this.on(eventName, onceWrapper);
}
}
export default EventEmitter;