11. Proyecto [vuejs-09]: uso de un plugin [eventBus]
El proyecto [vuejs-09] es idéntico al proyecto [vuejs-08], salvo que introduce el concepto de plugin. La estructura del proyecto es la siguiente:

11.1. El plugin [./plugins/event-bus]
El script [./event-bus.js] sigue siendo el mismo que en el ejemplo anterior:
import Vue from 'vue';
const eventBus = new Vue();
export default eventBus;
El plugin [./plugins/event-bus.js] es el siguiente:
export default {
install(Vue, eventBus) {
// añade una propiedad [$eventBus] a la clase Vue
Object.defineProperty(Vue.prototype, '$eventBus', {
// cuando se hace referencia a Vue.$eventBus, se devuelve el segundo parámetro [eventBus]
get: () => eventBus,
})
}
}
Comentarios
- un plugin [Vue] es un objeto que tiene una función [install] (línea 2). Esta se llamará automáticamente cuando un código declare el uso del plugin;
- líneas 1-9: el objeto exportado por el script;
- línea 2: la función [install] acepta aquí dos parámetros:
- [Vue]: la función obtenida mediante la instrucción [import Vue from ‘Vue’]. Puede asimilarse a una clase;
- [eventBus]: el objeto exportado por el script [./event-bus];
- líneas 4-7: modifican la definición (lo que se denomina el prototipo) de la función [Vue] añadiéndole la propiedad [$eventBus]. Si lo analizamos con el término [classe], la propiedad [$eventBus] se añade a la clase [Vue]. Por lo tanto, los componentes que son instancias de [Vue] tendrán acceso a esta nueva propiedad;
- la línea 6 indica que, al hacer referencia a la propiedad [Vue].$eventBus, se obtendrá el parámetro [eventBus] de la línea 2. Veremos más adelante que este segundo parámetro será el objeto [eventBus] exportado por el script [./event-bus.js]. Así pues, al final, cuando un componente C utilice la expresión [C.$eventBus], hará referencia al objeto [eventBus] exportado por el script [./event-bus.js]. Esto le evitará tener que importar el script [./event-bus.js]. Ahí radica el interés del plugin: simplificar el acceso al objeto [eventBus] exportado por el script [./event-bus.js];
- Cabe señalar que el plugin no tiene por qué llamarse a sí mismo [event-bus.js]. Se podría haber llamado [plugin-event-bus], por ejemplo;
- cabe señalar también que el término $ en [$eventBus] es una convención para designar las propiedades de [Vue] que se han añadido mediante complementos. No es obligatorio seguir esta convención. En este texto, la seguiremos;
11.2. El script principal [main.js]
El script [./plugins/event-bus.js] define un plugin para el framework [Vue.js]. Este plugin aún no se utiliza, solo está definido. Es el script [main.js] el que lo activa:
// importaciones
import Vue from 'vue'
import App from './App.vue'
// plugins
import BootstrapVue from 'bootstrap-vue'
Vue.use(BootstrapVue);
// bootstrap
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'
// eventbus
import eventBus from './event-bus';
import PluginEventBus from './plugins/event-bus';
Vue.use(PluginEventBus, eventBus);
// configuración
Vue.config.productionTip = false
// instanciación del proyecto [App]
new Vue({
render: h => h(App),
}).$mount('#app')
Comentarios
- las líneas 14-16 activan el complemento [PluginEventBus]. Después de la línea 16, todas las instancias de la clase (función) [Vue] poseen la propiedad [$eventBus], que apunta, para cada una de ellas, al mismo objeto exportado por el script [./event-bus.js]. Este será el caso para cada uno de los componentes del proyecto;
11.3. La vista principal [App]
La vista principal [App] sigue siendo la misma que en el proyecto anterior.
11.4. El componente [Component1]
El componente [Component1] utiliza ahora su propiedad [$eventBus] para escuchar el evento [someEvent]:
<template>
<b-row>
<b-col>
<b-alert show
variant="warning"
v-if="showMsg">Evénement [someEvent] intercepté par [Component1]. Valeur reçue={{data}}</b-alert>
</b-col>
</b-row>
</template>
<script>
export default {
name: "component1",
// estado del componente
data() {
return {
data: "",
showMsg: false
};
},
// métodos de gestión de eventos
methods: {
// gestión del evento [someEvent]
doSomething(data) {
this.data = data;
this.showMsg = true;
}
},
// gestión del ciclo de vida del componente
// evento [created]: se ha creado el componente
created() {
// escucha del evento [someEvent]
this.$eventBus.$on("someEvent", this.doSomething);
}
};
</script>
Comentarios
- línea 33, uso de la propiedad [this.$eventBus] del componente. Cabe destacar además que el script de la línea 11 ya no importa el script [./event-bus.js];
11.5. El componente [Component2]
El componente [Component2] utiliza ahora su propiedad [$eventBus] para emitir el evento [someEvent]:
<template>
<div>
<b-button @click="createEvent">Créer un événement</b-button>
</div>
</template>
<!-- script -->
<script>
export default {
name: "component2",
// métodos de gestión de eventos
methods: {
createEvent() {
this.$eventBus.$emit("someEvent", { x: 2, y: 4 })
}
}
};
</script>
Comentarios
- línea 13, uso de la propiedad [this.$eventBus] del componente. Cabe destacar además que el script de la línea 7 ya no importa el script [./event-bus.js];
11.6. Componente [Component3]
El componente [Component3] tiene el mismo código que [Component1]. Este también escucha el evento [someEvent].
11.7. Ejecución del proyecto

Se obtienen los mismos resultados que en el proyecto anterior.