@mundoit-lib/plugin-vue-event
Version:
Vue 3 plugin to handle global events between components, inspired by vue-events. This plugin provides a simple and efficient event bus system, allowing to emit, listen and unregister events in an intuitive way. Compatible with Vue 2 and Vue 3.
72 lines (63 loc) • 2.32 kB
text/typescript
import mitt, { type Emitter, type EventType, type Handler } from 'mitt';
// Define el tipo de eventos de tu aplicación
// Puedes extender este tipo según tus necesidades
export type EventBusEvents = Record<EventType, any>;
// Tipos para los listeners
type EventListener<T = any> = (args: T) => void;
type UnwrappedHandler<T = any> = (...args: any[]) => T;
// Exportamos una única instancia del event bus
export const eventBus: Emitter<EventBusEvents> = mitt<EventBusEvents>();
// Interface para el retorno de useEventBus
export interface EventBusInstance {
emit<K extends keyof EventBusEvents>(event: K, ...args: any[]): void;
on<K extends keyof EventBusEvents>(
event: K,
callback: UnwrappedHandler
): Handler<EventBusEvents[K]>;
fire<K extends keyof EventBusEvents>(event: K, ...args: any[]): void;
off<K extends keyof EventBusEvents>(
event: K,
listener: Handler<EventBusEvents[K]>
): void;
once<K extends keyof EventBusEvents>(
event: K,
callback: UnwrappedHandler
): Handler<EventBusEvents[K]>;
}
// Exportamos helpers para usar en composables o archivos JS/TS
export const useEventBus = (): EventBusInstance => {
return {
emit<K extends keyof EventBusEvents>(event: K, ...args: any[]): void {
eventBus.emit(event, args);
},
on<K extends keyof EventBusEvents>(
event: K,
callback: UnwrappedHandler
): Handler<EventBusEvents[K]> {
const listener: Handler<EventBusEvents[K]> = (args: any) => callback(...args);
eventBus.on(event, listener);
return listener;
},
fire<K extends keyof EventBusEvents>(event: K, ...args: any[]): void {
eventBus.emit(event, args);
},
off<K extends keyof EventBusEvents>(
event: K,
listener: Handler<EventBusEvents[K]>
): void {
eventBus.off(event, listener);
},
once<K extends keyof EventBusEvents>(
event: K,
callback: UnwrappedHandler
): Handler<EventBusEvents[K]> {
const listener: Handler<EventBusEvents[K]> = (args: any) => callback(...args);
const wrappedListener: Handler<EventBusEvents[K]> = (args: any) => {
listener(args);
eventBus.off(event, wrappedListener);
};
eventBus.on(event, wrappedListener);
return wrappedListener;
}
};
};