@mundoit-lib/plugin-vue-event 1.0.2 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -0
- package/dist/eventBus.cjs +114 -36
- package/dist/eventBus.d.cts +53 -14
- package/dist/eventBus.d.ts +53 -14
- package/dist/eventBus.js +84 -31
- package/dist/index.cjs +11 -91
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -82
- package/dist/plugin.cjs +36 -88
- package/dist/plugin.d.cts +24 -9
- package/dist/plugin.d.ts +24 -9
- package/dist/plugin.js +34 -82
- package/dist/useEvents.cjs +51 -0
- package/dist/useEvents.d.cts +11 -0
- package/dist/useEvents.d.ts +11 -0
- package/dist/useEvents.js +50 -0
- package/package.json +80 -59
- package/src/eventBus.ts +0 -72
- package/src/index.ts +0 -3
- package/src/plugin.ts +0 -91
package/dist/index.js
CHANGED
|
@@ -1,83 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import { EVENTS_KEY, createEventBus, eventBus, useEventBus } from "./eventBus.js";
|
|
2
|
+
import eventsPlugin from "./plugin.js";
|
|
3
|
+
import { useEvents } from "./useEvents.js";
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
var eventBus = mitt();
|
|
6
|
-
var useEventBus = () => {
|
|
7
|
-
return {
|
|
8
|
-
emit(event, ...args) {
|
|
9
|
-
eventBus.emit(event, args);
|
|
10
|
-
},
|
|
11
|
-
on(event, callback) {
|
|
12
|
-
const listener = (args) => callback(...args);
|
|
13
|
-
eventBus.on(event, listener);
|
|
14
|
-
return listener;
|
|
15
|
-
},
|
|
16
|
-
fire(event, ...args) {
|
|
17
|
-
eventBus.emit(event, args);
|
|
18
|
-
},
|
|
19
|
-
off(event, listener) {
|
|
20
|
-
eventBus.off(event, listener);
|
|
21
|
-
},
|
|
22
|
-
once(event, callback) {
|
|
23
|
-
const listener = (args) => callback(...args);
|
|
24
|
-
const wrappedListener = (args) => {
|
|
25
|
-
listener(args);
|
|
26
|
-
eventBus.off(event, wrappedListener);
|
|
27
|
-
};
|
|
28
|
-
eventBus.on(event, wrappedListener);
|
|
29
|
-
return wrappedListener;
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
};
|
|
33
|
-
function plugin(VueOrApp) {
|
|
34
|
-
const bus = useEventBus();
|
|
35
|
-
if (isVue3) {
|
|
36
|
-
const app = VueOrApp;
|
|
37
|
-
app.config.globalProperties.$events = bus;
|
|
38
|
-
app.mixin({
|
|
39
|
-
beforeCreate() {
|
|
40
|
-
if (typeof this.$options.events !== "object") return;
|
|
41
|
-
this._eventListeners = [];
|
|
42
|
-
for (const [event, handler] of Object.entries(this.$options.events)) {
|
|
43
|
-
const boundHandler = handler.bind(this);
|
|
44
|
-
const listener = bus.on(event, boundHandler);
|
|
45
|
-
this._eventListeners.push({ event, listener });
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
beforeUnmount() {
|
|
49
|
-
if (!this._eventListeners) return;
|
|
50
|
-
for (const { event, listener } of this._eventListeners) {
|
|
51
|
-
bus.off(event, listener);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
} else if (isVue2) {
|
|
56
|
-
const Vue = VueOrApp;
|
|
57
|
-
Object.defineProperty(Vue.prototype, "$events", {
|
|
58
|
-
get() {
|
|
59
|
-
return bus;
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
Vue.mixin({
|
|
63
|
-
beforeCreate() {
|
|
64
|
-
if (typeof this.$options.events !== "object") return;
|
|
65
|
-
this._eventListeners = [];
|
|
66
|
-
for (const [event, handler] of Object.entries(this.$options.events)) {
|
|
67
|
-
const boundHandler = handler.bind(this);
|
|
68
|
-
const listener = bus.on(event, boundHandler);
|
|
69
|
-
this._eventListeners.push({ event, listener });
|
|
70
|
-
}
|
|
71
|
-
},
|
|
72
|
-
beforeDestroy() {
|
|
73
|
-
if (!this._eventListeners) return;
|
|
74
|
-
for (const { event, listener } of this._eventListeners) {
|
|
75
|
-
bus.off(event, listener);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
var plugin_default = plugin;
|
|
82
|
-
|
|
83
|
-
export { eventBus, plugin_default as eventsPlugin, useEventBus };
|
|
5
|
+
export { EVENTS_KEY, createEventBus, eventBus, eventsPlugin, useEventBus, useEvents };
|
package/dist/plugin.cjs
CHANGED
|
@@ -1,91 +1,39 @@
|
|
|
1
|
-
'
|
|
1
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
|
|
2
|
+
const require_eventBus = require('./eventBus.cjs');
|
|
2
3
|
|
|
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
|
-
eventBus.on(event, wrappedListener);
|
|
35
|
-
return wrappedListener;
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
// src/plugin.ts
|
|
41
|
-
function plugin(VueOrApp) {
|
|
42
|
-
const bus = useEventBus();
|
|
43
|
-
if (vueDemi.isVue3) {
|
|
44
|
-
const app = VueOrApp;
|
|
45
|
-
app.config.globalProperties.$events = bus;
|
|
46
|
-
app.mixin({
|
|
47
|
-
beforeCreate() {
|
|
48
|
-
if (typeof this.$options.events !== "object") return;
|
|
49
|
-
this._eventListeners = [];
|
|
50
|
-
for (const [event, handler] of Object.entries(this.$options.events)) {
|
|
51
|
-
const boundHandler = handler.bind(this);
|
|
52
|
-
const listener = bus.on(event, boundHandler);
|
|
53
|
-
this._eventListeners.push({ event, listener });
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
beforeUnmount() {
|
|
57
|
-
if (!this._eventListeners) return;
|
|
58
|
-
for (const { event, listener } of this._eventListeners) {
|
|
59
|
-
bus.off(event, listener);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
} else if (vueDemi.isVue2) {
|
|
64
|
-
const Vue = VueOrApp;
|
|
65
|
-
Object.defineProperty(Vue.prototype, "$events", {
|
|
66
|
-
get() {
|
|
67
|
-
return bus;
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
Vue.mixin({
|
|
71
|
-
beforeCreate() {
|
|
72
|
-
if (typeof this.$options.events !== "object") return;
|
|
73
|
-
this._eventListeners = [];
|
|
74
|
-
for (const [event, handler] of Object.entries(this.$options.events)) {
|
|
75
|
-
const boundHandler = handler.bind(this);
|
|
76
|
-
const listener = bus.on(event, boundHandler);
|
|
77
|
-
this._eventListeners.push({ event, listener });
|
|
78
|
-
}
|
|
79
|
-
},
|
|
80
|
-
beforeDestroy() {
|
|
81
|
-
if (!this._eventListeners) return;
|
|
82
|
-
for (const { event, listener } of this._eventListeners) {
|
|
83
|
-
bus.off(event, listener);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
}
|
|
4
|
+
//#region src/plugin.ts
|
|
5
|
+
/**
|
|
6
|
+
* Plugin de Vue 3: expone `$events`, hace `app.provide('mundoitEvents', bus)` y registra
|
|
7
|
+
* la opción de componente `events: { 'nombre'() {} }`.
|
|
8
|
+
*/
|
|
9
|
+
function eventsPlugin(app, options = {}) {
|
|
10
|
+
const bus = options.bus ?? require_eventBus.eventBus;
|
|
11
|
+
const listeners = /* @__PURE__ */ new WeakMap();
|
|
12
|
+
app.config.globalProperties.$events = bus;
|
|
13
|
+
app.provide(require_eventBus.EVENTS_KEY, bus);
|
|
14
|
+
app.mixin({
|
|
15
|
+
beforeCreate() {
|
|
16
|
+
const events = this.$options.events;
|
|
17
|
+
if (!events || typeof events !== "object") return;
|
|
18
|
+
const stored = [];
|
|
19
|
+
for (const [event, handler] of Object.entries(events)) {
|
|
20
|
+
if (typeof handler !== "function") continue;
|
|
21
|
+
stored.push({
|
|
22
|
+
event,
|
|
23
|
+
listener: bus.on(event, handler.bind(this))
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
listeners.set(this, stored);
|
|
27
|
+
},
|
|
28
|
+
beforeUnmount() {
|
|
29
|
+
const stored = listeners.get(this);
|
|
30
|
+
if (!stored) return;
|
|
31
|
+
for (const { event, listener } of stored) bus.off(event, listener);
|
|
32
|
+
listeners.delete(this);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
88
35
|
}
|
|
89
|
-
var plugin_default = plugin;
|
|
90
36
|
|
|
91
|
-
|
|
37
|
+
//#endregion
|
|
38
|
+
exports.default = eventsPlugin;
|
|
39
|
+
exports.eventsPlugin = eventsPlugin;
|
package/dist/plugin.d.cts
CHANGED
|
@@ -1,10 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { EventBus } from "./eventBus.cjs";
|
|
2
|
+
import { App } from "vue";
|
|
3
|
+
//#region src/plugin.d.ts
|
|
4
|
+
export interface EventsPluginOptions {
|
|
5
|
+
/** Bus a usar en la app. Por defecto, el bus compartido `eventBus`. */
|
|
6
|
+
bus?: EventBus;
|
|
6
7
|
}
|
|
7
|
-
|
|
8
|
-
declare
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
type EventsOption = Record<string, (...args: any[]) => void>;
|
|
9
|
+
declare module 'vue' {
|
|
10
|
+
interface ComponentCustomProperties {
|
|
11
|
+
/** Bus de eventos de la app (`@mundoit-lib/plugin-vue-event`). */
|
|
12
|
+
$events: EventBus;
|
|
13
|
+
}
|
|
14
|
+
interface ComponentCustomOptions {
|
|
15
|
+
/** Listeners del bus: se registran en `beforeCreate` y se desregistran en `beforeUnmount`. */
|
|
16
|
+
events?: EventsOption;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Plugin de Vue 3: expone `$events`, hace `app.provide('mundoitEvents', bus)` y registra
|
|
21
|
+
* la opción de componente `events: { 'nombre'() {} }`.
|
|
22
|
+
*/
|
|
23
|
+
declare function eventsPlugin(app: App, options?: EventsPluginOptions): void;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { eventsPlugin as default, eventsPlugin };
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,10 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { EventBus } from "./eventBus.js";
|
|
2
|
+
import { App } from "vue";
|
|
3
|
+
//#region src/plugin.d.ts
|
|
4
|
+
export interface EventsPluginOptions {
|
|
5
|
+
/** Bus a usar en la app. Por defecto, el bus compartido `eventBus`. */
|
|
6
|
+
bus?: EventBus;
|
|
6
7
|
}
|
|
7
|
-
|
|
8
|
-
declare
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
type EventsOption = Record<string, (...args: any[]) => void>;
|
|
9
|
+
declare module 'vue' {
|
|
10
|
+
interface ComponentCustomProperties {
|
|
11
|
+
/** Bus de eventos de la app (`@mundoit-lib/plugin-vue-event`). */
|
|
12
|
+
$events: EventBus;
|
|
13
|
+
}
|
|
14
|
+
interface ComponentCustomOptions {
|
|
15
|
+
/** Listeners del bus: se registran en `beforeCreate` y se desregistran en `beforeUnmount`. */
|
|
16
|
+
events?: EventsOption;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Plugin de Vue 3: expone `$events`, hace `app.provide('mundoitEvents', bus)` y registra
|
|
21
|
+
* la opción de componente `events: { 'nombre'() {} }`.
|
|
22
|
+
*/
|
|
23
|
+
declare function eventsPlugin(app: App, options?: EventsPluginOptions): void;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { eventsPlugin as default, eventsPlugin };
|
package/dist/plugin.js
CHANGED
|
@@ -1,85 +1,37 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import mitt from 'mitt';
|
|
1
|
+
import { EVENTS_KEY, eventBus } from "./eventBus.js";
|
|
3
2
|
|
|
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
|
-
function plugin(VueOrApp) {
|
|
36
|
-
const bus = useEventBus();
|
|
37
|
-
if (isVue3) {
|
|
38
|
-
const app = VueOrApp;
|
|
39
|
-
app.config.globalProperties.$events = bus;
|
|
40
|
-
app.mixin({
|
|
41
|
-
beforeCreate() {
|
|
42
|
-
if (typeof this.$options.events !== "object") return;
|
|
43
|
-
this._eventListeners = [];
|
|
44
|
-
for (const [event, handler] of Object.entries(this.$options.events)) {
|
|
45
|
-
const boundHandler = handler.bind(this);
|
|
46
|
-
const listener = bus.on(event, boundHandler);
|
|
47
|
-
this._eventListeners.push({ event, listener });
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
beforeUnmount() {
|
|
51
|
-
if (!this._eventListeners) return;
|
|
52
|
-
for (const { event, listener } of this._eventListeners) {
|
|
53
|
-
bus.off(event, listener);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
} else if (isVue2) {
|
|
58
|
-
const Vue = VueOrApp;
|
|
59
|
-
Object.defineProperty(Vue.prototype, "$events", {
|
|
60
|
-
get() {
|
|
61
|
-
return bus;
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
Vue.mixin({
|
|
65
|
-
beforeCreate() {
|
|
66
|
-
if (typeof this.$options.events !== "object") return;
|
|
67
|
-
this._eventListeners = [];
|
|
68
|
-
for (const [event, handler] of Object.entries(this.$options.events)) {
|
|
69
|
-
const boundHandler = handler.bind(this);
|
|
70
|
-
const listener = bus.on(event, boundHandler);
|
|
71
|
-
this._eventListeners.push({ event, listener });
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
beforeDestroy() {
|
|
75
|
-
if (!this._eventListeners) return;
|
|
76
|
-
for (const { event, listener } of this._eventListeners) {
|
|
77
|
-
bus.off(event, listener);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
}
|
|
3
|
+
//#region src/plugin.ts
|
|
4
|
+
/**
|
|
5
|
+
* Plugin de Vue 3: expone `$events`, hace `app.provide('mundoitEvents', bus)` y registra
|
|
6
|
+
* la opción de componente `events: { 'nombre'() {} }`.
|
|
7
|
+
*/
|
|
8
|
+
function eventsPlugin(app, options = {}) {
|
|
9
|
+
const bus = options.bus ?? eventBus;
|
|
10
|
+
const listeners = /* @__PURE__ */ new WeakMap();
|
|
11
|
+
app.config.globalProperties.$events = bus;
|
|
12
|
+
app.provide(EVENTS_KEY, bus);
|
|
13
|
+
app.mixin({
|
|
14
|
+
beforeCreate() {
|
|
15
|
+
const events = this.$options.events;
|
|
16
|
+
if (!events || typeof events !== "object") return;
|
|
17
|
+
const stored = [];
|
|
18
|
+
for (const [event, handler] of Object.entries(events)) {
|
|
19
|
+
if (typeof handler !== "function") continue;
|
|
20
|
+
stored.push({
|
|
21
|
+
event,
|
|
22
|
+
listener: bus.on(event, handler.bind(this))
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
listeners.set(this, stored);
|
|
26
|
+
},
|
|
27
|
+
beforeUnmount() {
|
|
28
|
+
const stored = listeners.get(this);
|
|
29
|
+
if (!stored) return;
|
|
30
|
+
for (const { event, listener } of stored) bus.off(event, listener);
|
|
31
|
+
listeners.delete(this);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
82
34
|
}
|
|
83
|
-
var plugin_default = plugin;
|
|
84
35
|
|
|
85
|
-
|
|
36
|
+
//#endregion
|
|
37
|
+
export { eventsPlugin as default, eventsPlugin };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_eventBus = require('./eventBus.cjs');
|
|
3
|
+
let vue = require("vue");
|
|
4
|
+
|
|
5
|
+
//#region src/useEvents.ts
|
|
6
|
+
/**
|
|
7
|
+
* Bus de eventos para Composition API. Lo que se registre con `on`/`once` desde un `setup`
|
|
8
|
+
* se desregistra solo en `onBeforeUnmount`. Fuera de un componente se comporta como el bus.
|
|
9
|
+
*
|
|
10
|
+
* @param bus bus a usar; por defecto, el de la app (`install(app, { bus })`) o el bus por defecto.
|
|
11
|
+
*/
|
|
12
|
+
function useEvents(bus = require_eventBus.useEventBus()) {
|
|
13
|
+
const registrations = [];
|
|
14
|
+
function add(event, listener, once) {
|
|
15
|
+
const fn = listener;
|
|
16
|
+
const registration = {
|
|
17
|
+
event,
|
|
18
|
+
listener: fn,
|
|
19
|
+
handler: fn
|
|
20
|
+
};
|
|
21
|
+
registration.handler = once ? (...args) => {
|
|
22
|
+
remove(registration);
|
|
23
|
+
fn(...args);
|
|
24
|
+
} : (...args) => fn(...args);
|
|
25
|
+
registrations.push(registration);
|
|
26
|
+
bus.on(event, registration.handler);
|
|
27
|
+
return listener;
|
|
28
|
+
}
|
|
29
|
+
function remove(registration) {
|
|
30
|
+
const index = registrations.indexOf(registration);
|
|
31
|
+
if (index !== -1) registrations.splice(index, 1);
|
|
32
|
+
bus.off(registration.event, registration.handler);
|
|
33
|
+
}
|
|
34
|
+
if ((0, vue.getCurrentInstance)()) (0, vue.onBeforeUnmount)(() => {
|
|
35
|
+
for (const registration of [...registrations]) remove(registration);
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
emit: (event, ...args) => bus.emit(event, ...args),
|
|
39
|
+
on: (event, listener) => add(event, listener, false),
|
|
40
|
+
once: (event, listener) => add(event, listener, true),
|
|
41
|
+
off(event, listener) {
|
|
42
|
+
const own = registrations.filter((r) => r.event === event && (!listener || r.listener === listener));
|
|
43
|
+
for (const registration of own) remove(registration);
|
|
44
|
+
if (!listener) bus.off(event);
|
|
45
|
+
else if (!own.length) bus.off(event, listener);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
exports.useEvents = useEvents;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EventBus } from "./eventBus.cjs";
|
|
2
|
+
//#region src/useEvents.d.ts
|
|
3
|
+
export type UseEventsReturn = Pick<EventBus, 'emit' | 'on' | 'once' | 'off'>;
|
|
4
|
+
/**
|
|
5
|
+
* Bus de eventos para Composition API. Lo que se registre con `on`/`once` desde un `setup`
|
|
6
|
+
* se desregistra solo en `onBeforeUnmount`. Fuera de un componente se comporta como el bus.
|
|
7
|
+
*
|
|
8
|
+
* @param bus bus a usar; por defecto, el de la app (`install(app, { bus })`) o el bus por defecto.
|
|
9
|
+
*/
|
|
10
|
+
export declare function useEvents(bus?: EventBus): UseEventsReturn;
|
|
11
|
+
//#endregion
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EventBus } from "./eventBus.js";
|
|
2
|
+
//#region src/useEvents.d.ts
|
|
3
|
+
export type UseEventsReturn = Pick<EventBus, 'emit' | 'on' | 'once' | 'off'>;
|
|
4
|
+
/**
|
|
5
|
+
* Bus de eventos para Composition API. Lo que se registre con `on`/`once` desde un `setup`
|
|
6
|
+
* se desregistra solo en `onBeforeUnmount`. Fuera de un componente se comporta como el bus.
|
|
7
|
+
*
|
|
8
|
+
* @param bus bus a usar; por defecto, el de la app (`install(app, { bus })`) o el bus por defecto.
|
|
9
|
+
*/
|
|
10
|
+
export declare function useEvents(bus?: EventBus): UseEventsReturn;
|
|
11
|
+
//#endregion
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { useEventBus } from "./eventBus.js";
|
|
2
|
+
import { getCurrentInstance, onBeforeUnmount } from "vue";
|
|
3
|
+
|
|
4
|
+
//#region src/useEvents.ts
|
|
5
|
+
/**
|
|
6
|
+
* Bus de eventos para Composition API. Lo que se registre con `on`/`once` desde un `setup`
|
|
7
|
+
* se desregistra solo en `onBeforeUnmount`. Fuera de un componente se comporta como el bus.
|
|
8
|
+
*
|
|
9
|
+
* @param bus bus a usar; por defecto, el de la app (`install(app, { bus })`) o el bus por defecto.
|
|
10
|
+
*/
|
|
11
|
+
function useEvents(bus = useEventBus()) {
|
|
12
|
+
const registrations = [];
|
|
13
|
+
function add(event, listener, once) {
|
|
14
|
+
const fn = listener;
|
|
15
|
+
const registration = {
|
|
16
|
+
event,
|
|
17
|
+
listener: fn,
|
|
18
|
+
handler: fn
|
|
19
|
+
};
|
|
20
|
+
registration.handler = once ? (...args) => {
|
|
21
|
+
remove(registration);
|
|
22
|
+
fn(...args);
|
|
23
|
+
} : (...args) => fn(...args);
|
|
24
|
+
registrations.push(registration);
|
|
25
|
+
bus.on(event, registration.handler);
|
|
26
|
+
return listener;
|
|
27
|
+
}
|
|
28
|
+
function remove(registration) {
|
|
29
|
+
const index = registrations.indexOf(registration);
|
|
30
|
+
if (index !== -1) registrations.splice(index, 1);
|
|
31
|
+
bus.off(registration.event, registration.handler);
|
|
32
|
+
}
|
|
33
|
+
if (getCurrentInstance()) onBeforeUnmount(() => {
|
|
34
|
+
for (const registration of [...registrations]) remove(registration);
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
emit: (event, ...args) => bus.emit(event, ...args),
|
|
38
|
+
on: (event, listener) => add(event, listener, false),
|
|
39
|
+
once: (event, listener) => add(event, listener, true),
|
|
40
|
+
off(event, listener) {
|
|
41
|
+
const own = registrations.filter((r) => r.event === event && (!listener || r.listener === listener));
|
|
42
|
+
for (const registration of own) remove(registration);
|
|
43
|
+
if (!listener) bus.off(event);
|
|
44
|
+
else if (!own.length) bus.off(event, listener);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
//#endregion
|
|
50
|
+
export { useEvents };
|