UNPKG

@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.

92 lines (85 loc) 2.54 kB
'use strict'; var vueDemi = require('vue-demi'); var mitt = require('mitt'); function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } var mitt__default = /*#__PURE__*/_interopDefault(mitt); // src/plugin.ts var eventBus = mitt__default.default(); var useEventBus = () => { return { emit(event, ...args) { eventBus.emit(event, args); }, on(event, callback) { const listener = (args) => callback(...args); eventBus.on(event, listener); return listener; }, fire(event, ...args) { eventBus.emit(event, args); }, off(event, listener) { eventBus.off(event, listener); }, once(event, callback) { const listener = (args) => callback(...args); const wrappedListener = (args) => { listener(args); eventBus.off(event, wrappedListener); }; eventBus.on(event, wrappedListener); return wrappedListener; } }; }; // src/plugin.ts function plugin(VueOrApp) { const bus = useEventBus(); if (vueDemi.isVue3) { const app = VueOrApp; app.config.globalProperties.$events = bus; app.mixin({ beforeCreate() { if (typeof this.$options.events !== "object") return; this._eventListeners = []; for (const [event, handler] of Object.entries(this.$options.events)) { const boundHandler = handler.bind(this); const listener = bus.on(event, boundHandler); this._eventListeners.push({ event, listener }); } }, beforeUnmount() { if (!this._eventListeners) return; for (const { event, listener } of this._eventListeners) { bus.off(event, listener); } } }); } else if (vueDemi.isVue2) { const Vue = VueOrApp; Object.defineProperty(Vue.prototype, "$events", { get() { return bus; } }); Vue.mixin({ beforeCreate() { if (typeof this.$options.events !== "object") return; this._eventListeners = []; for (const [event, handler] of Object.entries(this.$options.events)) { const boundHandler = handler.bind(this); const listener = bus.on(event, boundHandler); this._eventListeners.push({ event, listener }); } }, beforeDestroy() { if (!this._eventListeners) return; for (const { event, listener } of this._eventListeners) { bus.off(event, listener); } } }); } } var plugin_default = plugin; module.exports = plugin_default;