eventBus.js
2.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/**
* 事件总线工具
*
* @description 轻量级事件总线,用于跨页面组件通信
* @module utils/eventBus
* @author Claude Code
* @created 2026-02-08
*/
/**
* 事件总线实现
* @type {Object}
*/
const eventBus = {
/**
* 事件监听器存储
* @type {Object<string, Array<Function>>}
*/
events: {},
/**
* 监听事件
*
* @param {string} event - 事件名称
* @param {Function} callback - 回调函数
* @returns {Function} 取消监听函数
*
* @example
* const off = eventBus.on('feedback:submit', (data) => {
* console.log('收到反馈提交事件:', data)
* })
* // 取消监听
* off()
*/
on(event, callback) {
if (!this.events[event]) {
this.events[event] = []
}
this.events[event].push(callback)
// 返回取消监听函数
return () => this.off(event, callback)
},
/**
* 取消监听事件
*
* @param {string} event - 事件名称
* @param {Function} callback - 回调函数
*/
off(event, callback) {
if (!this.events[event]) return
if (callback) {
// 移除特定的回调
this.events[event] = this.events[event].filter(cb => cb !== callback)
} else {
// 移除所有回调
delete this.events[event]
}
},
/**
* 发送事件
*
* @param {string} event - 事件名称
* @param {*} data - 事件数据
*
* @example
* eventBus.emit('feedback:submit', { id: 123 })
*/
emit(event, data) {
if (!this.events[event]) return
this.events[event].forEach(callback => {
try {
callback(data)
} catch (err) {
console.error(`[EventBus] 事件处理错误 [${event}]:`, err)
}
})
},
/**
* 清空所有事件监听器
*/
clear() {
this.events = {}
}
}
/**
* 事件名称常量
* @enum {string}
*/
export const Events = {
/** 反馈提交成功 */
FEEDBACK_SUBMIT: 'feedback:submit',
/** 收藏列表更新 */
FAVORITES_UPDATE: 'favorites:update',
/** 用户信息更新 */
USER_UPDATE: 'user:update'
}
export default eventBus