Plugin Event Bus: comunicar componentes sin relación en Vue
Clase 30 de 53 • Curso Profesional de Vue.js 2
Contenido del curso
CLI y Dev Tools
- 3

Instalación de Vue.js: Node, Dev Tools y CLI
06:13 min - 4

Crear una aplicación Vue con CLI y webpack
12:49 min - 5

Cómo funciona webpack.config.js
10:38 min - 6

Babel: transpilador de JavaScript moderno
05:06 min - 7

ESLint con Standard JS: linteo automático en webpack
15:34 min - 8

Configuración de Sass y Bulma en Vue
06:18 min - 9

Cómo configurar Pug en Vue con webpack
04:23 min - 10
Diseño de Mockups: Práctica y Colaboración en Comunidad
00:20 min - 11
Creación de Vistas con Mockups y Vue.js
00:32 min
Manipulación del DOM
- 12

Expresiones en Vue: sintaxis doble llave
03:49 min - 13

Diferencia entre v-show y v-if en el DOM
06:22 min - 14

Qué es data binding en Vue.js
04:11 min - 15

Computed properties en Vue.js: cómo crearlas
04:13 min - 16

Qué son los watchers de Vue
02:25 min - 17

Eventos Vue: directiva v-on y métodos format
06:12 min - 18

Cómo construir una interfaz de búsqueda completa en Vue
19:03 min - 19
Manipulación del DOM con Vue.js: Práctica y Ejercicios
03:00 min
REST y HTTP
Sistema de Componentes
- 23

Cómo crear componentes en Vue
08:46 min - 24

Componentes Layout en Vue con Bulma
09:50 min - 25

Reactividad en Vue: $set y Object.assign
06:14 min - 26

Hooks del ciclo de vida en Vue.js
05:38 min - 27

Comunicación padre-hijo con props en Vue
23:27 min - 28

Eventos en Vue: comunicar hijo a padre
12:04 min - 29

Slots: HTML dinámico en componentes Vue
13:42 min - 30

Plugin Event Bus: comunicar componentes sin relación en Vue
Viendo ahora
Vue Router
Extendiendo VueJS
Clases, Animaciones y Transiciones36
Vuex
- 39

Cómo Vuex centraliza estados en Vue
03:41 min - 40

Instalación de Vuex con estado único
17:32 min - 41

Cómo usar mutations y commit en Vuex
08:16 min - 42

Getters de Vuex: mapGetters y store sincronizado
07:35 min - 43

Cómo dispatch ejecuta actions asincrónicas en ViewX
07:54 min - 44

Instalación de Viewex en Platzi Music
26:37 min
Nuxt.js
Deploy a Producción con Now
Conclusiones
Bonus
Potencia tus interfaces en Vue con una estrategia clara para mostrar resultados de búsqueda, un plugin de event bus para comunicar componentes sin relación directa y un player de audio en HTML5. Aquí encontrarás los pasos esenciales, el código clave y las prácticas recomendadas para que todo funcione de forma consistente y mantenible.
¿Cómo mejorar el notification component para comunicar resultados?
Mostrar feedback inmediato eleva la experiencia de usuario. La propuesta es que el componente de notificación informe tanto errores como la cantidad de resultados hallados, y que aparezca siempre después de una búsqueda.
- Agregar una propiedad para el color. Por ejemplo: verde cuando todo estuvo bien y rojo cuando hubo error. Puedes mapearlo a clases de Bulma como isDanger o isSucces.
- Mostrar el mensaje siempre tras la búsqueda. No sólo cuando hay errores.
- Hacer el contenido del mensaje condicional. Usar v-show o v-if para alternar entre “no se encontraron resultados” y “se encontraron N resultados”.
Ejemplo orientativo:
<notification :class="['notification', type]">
<template v-if="hasError">No se encontraron resultados.</template>
<template v-else>Se encontraron {{ total }} resultados.</template>
</notification>
Claves que refuerzas: propiedades de componente, renderizado condicional con v-show/v-if y uso de clases utilitarias de Bulma.
¿Cómo comunicar componentes no relacionados en Vue con un plugin Event Bus?
Cuando los componentes no son padre-hijo, Vue no trae una alternativa directa. La solución didáctica propuesta: crear un plugin que inyecte un event bus global usando una nueva instancia de Vue, accesible como this.$bus con la misma API de $emit y $on.
¿Cómo crear el plugin?
Estructura en src/plugins un archivo event-bus.js que exponga install y extienda el prototype de Vue:
// src/plugins/event-bus.js
const EventBus = {};
EventBus.install = function (Vue) {
Vue.prototype.$bus = new Vue(); // misma API: $emit, $on.
};
export default EventBus;
Puntos clave: función install, extensión via Vue.prototype y convención del prefijo $ para indicar funcionalidad inyectada.
¿Cómo instalar y usarlo?
Regístralo en main.js con Vue.use para que esté disponible en todos los componentes.
// main.js
import Vue from 'vue';
import EventBus from '@/plugins/event-bus';
Vue.use(EventBus);
Emitir desde cualquier componente (por ejemplo, en Track.vue al seleccionar una canción):
this.$bus.$emit('set-track', track);
Escuchar en otro componente no relacionado (por ejemplo, en Player.vue dentro del hook created):
created() {
this.$bus.$on('set-track', (track) => {
this.track = track;
});
}
Beneficios inmediatos: desacoplamiento, comunicación entre hermanos o componentes en ramas distintas y reutilización simple. Además, se sugiere el uso de plugins para utilidades frecuentes como local storage (por ejemplo, this.$storage) sin imports repetidos.
¿Cómo integrar el player de audio y reproducir un track seleccionado?
Se crea un componente Player.vue que muestra portada, título, duración y un reproductor HTML5. El player escucha el evento set-track por el bus y actualiza su estado.
¿Qué estructura tiene Player.vue?
- Template con imagen, título en strong, duración en small y etiqueta audio con controls.
- data que expone track como objeto vacío.
- Estilos con tamaño fijo y borde redondeado.
Ejemplo base:
<template>
<div class="content">
<p>
<img class="image" :src="track.album && track.album.images ? track.album.images[0].url : ''" />
</p>
<p><strong>{{ track.name }}</strong></p>
<p><small>[{{ track.duration_ms }} ms]</small></p>
<p>
<audio controls>
<source :src="track.preview_url" />
</audio>
</p>
</div>
</template>
<script>
export default {
data() {
return { track: {} };
},
created() {
this.$bus.$on('set-track', (track) => { this.track = track; });
}
};
</script>
<style scoped lang="scss">
.image { width: 124px; border-radius: 50%; }
</style>
Notas prácticas del flujo: - preview_url puede venir nulo en algunas canciones. Sólo se reproducirá cuando exista. - El reproductor HTML5 usa controls: cada navegador lo renderiza con su UI nativa. - La imagen proviene de track.album.images[0].url. El título desde track.name. La duración se muestra en milisegundos a modo informativo. - Mantener scoped en estilos para no afectar otras imágenes.
¿Cómo se integra en la interfaz?
- Se importa y registra en el Header para renderizarlo bajo el título y subtítulo.
- El componente Track emite al seleccionar una canción. Player escucha y actualiza su interfaz y el audio.
- Uso de alias @ simplifica imports desde '@/components/Player'.
¿Te gustaría compartir más casos de uso para plugins en Vue o mejoras al player? Deja tus ideas y dudas en los comentarios.