/** * 简易事件总线(与全局 uni.$emit 隔离,避免命名冲突) */ export default class EventEmitter { constructor() { this._listeners = {} } on(event, handler) { if (typeof handler !== 'function') return () => {} if (!this._listeners[event]) this._listeners[event] = [] this._listeners[event].push(handler) return () => this.off(event, handler) } once(event, handler) { const wrapper = (...args) => { this.off(event, wrapper) handler(...args) } return this.on(event, wrapper) } off(event, handler) { if (!this._listeners[event]) return if (!handler) { delete this._listeners[event] return } this._listeners[event] = this._listeners[event].filter(fn => fn !== handler) } emit(event, ...args) { const list = this._listeners[event] if (!list || !list.length) return // 复制一份,避免回调中修改监听器 list.slice().forEach(fn => { try { fn(...args) } catch (e) { console.error(`[EventEmitter] ${event}`, e) } }) } clear() { this._listeners = {} } }