Files
TaskPool/web/src/composables/useEventBus.ts
T
2026-05-07 20:12:30 +08:00

36 lines
1.0 KiB
TypeScript

import { onMounted, onUnmounted } from 'vue';
import { eventBus, type WSMessage } from '../utils/event-bus';
/**
* Vue Composable: 使用系统事件总线
*
* @param eventType 可选,指定监听的消息类型
* @param handler 消息处理回调
*/
export function useEventBus(eventType: string | string[] | null, handler: (payload: any, type: string) => void) {
let unsubscribe: (() => void) | null = null;
const handleMessage = (msg: WSMessage) => {
if (!eventType) {
// 监听所有消息
handler(msg.payload, msg.type);
return;
}
const types = Array.isArray(eventType) ? eventType : [eventType];
if (types.includes(msg.type)) {
handler(msg.payload, msg.type);
}
};
onMounted(() => {
// 确保驱动已初始化 (单例内部会处理多次调用)
eventBus.init();
unsubscribe = eventBus.subscribe(handleMessage);
});
onUnmounted(() => {
if (unsubscribe) unsubscribe();
});
}