Eventos en Vue: comunicar hijo a padre
Clase 28 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
Viendo ahora - 29

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

Plugin Event Bus: comunicar componentes sin relación en Vue
19:19 min
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
Domina la comunicación entre componentes en Vue.js con eventos claros, payloads precisos y estilos encapsulados. Aquí verás cómo un hijo notifica al padre con $emit, cómo el padre escucha con v-on/@, y cómo resaltar la selección con v-bind:class y CSS scoped para evitar efectos colaterales.
¿Cómo enviar datos del hijo al padre en Vue.js?
La clave es usar eventos. De padre a hijo usamos props (inmutables), pero del hijo al padre enviamos información con $emit. Al hacer clic en el botón de reproducción, el componente hijo emite un evento con el ID de la canción como payload para que el padre lo escuche y actualice su estado.
¿Qué hace $emit y cómo pasar el payload?
- Emite un evento con un nombre claro: por ejemplo, "select".
- Adjunta un payload: aquí, el ID de la canción.
- Se usa desde un método del hijo.
<!-- Hijo: pm-track.vue -->
<template>
<button @click="selectTrack">Play</button>
</template>
<script>
export default {
methods: {
selectTrack() {
// Enviar al padre el ID de la canción como payload.
this.$emit('select', /* id de la canción */)
}
}
}
</script>
¿Cómo escucha el padre con v-on o @?
- Usa la directiva v-on (o @) con el mismo nombre del evento.
- Define un método que reciba el payload y actualice data.
- Guarda el ID en una variable como selectedTrack.
<!-- Padre: app.vue (uso del componente) -->
<pm-track @select="setSelectedTrack" />
<script>
export default {
data() {
return {
selectedTrack: ''
}
},
methods: {
setSelectedTrack(id) {
this.selectedTrack = id
}
}
}
</script>
- Consejo: en las herramientas de desarrollo verás el evento emitido con su payload y el emisor.
¿Cómo evitar errores comunes al asignar data?
- No asignes el nombre del método en vez de la propiedad: evita escribir algo como
this.setSelectedTrack = id. - La asignación correcta es:
this.selectedTrack = id. - Verifica en la pestaña de componentes que selectedTrack reciba el ID esperado.
¿Cómo resaltar el elemento seleccionado con v-bind:class?
Para destacar la canción activa, aplica una clase condicional cuando el ID del ítem coincida con selectedTrack. Así, solo un elemento tendrá la clase activa a la vez.
¿Qué sintaxis de objeto usar en :class?
- Usa la forma objeto en :class:
{ 'is-active': condicion }. - La condición compara
t.id === selectedTrack. - Se escribe en el componente donde tengas acceso a ambos valores.
<!-- Uso del componente en el padre con clase condicional -->
<pm-track
:class="{ 'is-active': t.id === selectedTrack }"
/>
/* Estilo para resaltar el elemento activo */
.is-active {
border: 3px solid; /* verde */
}
- Alternativas de :class: cadena simple, operador ternario o forma objeto.
- Recuerda las comillas: si fuera hay dobles, dentro usa simples.
¿Cómo aislar estilos con scoped y limpiar el CSS global?
Un CSS global puede afectar componentes no deseados. Si en loader definiste .content { min-height: 40vh; }, esa regla impactará todas las clases .content del proyecto. Encapsula estilos por componente para evitarlo.
¿Por qué min-height en loader afectaba otros componentes?
- El alcance global de CSS aplica por cascada.
.contenten loader terminó deformando cajas de canciones.- Inspecciona y verás
.contentheredandomin-heightypaddingfuera de loader.
¿Cómo solucionarlo con scoped?
- Agrega el atributo scoped al bloque de estilos del componente afectado.
- Eso limita el alcance del CSS al componente actual.
<!-- loader.vue -->
<style scoped>
.content {
min-height: 40vh;
/* padding existente, si aplica */
}
</style>
- Tras compilar, los estilos dejarán de afectar otros componentes como los tracks.
¿Qué otros ajustes rápidos mejoran el look?
- Elimina la clase "hash shadow" del navbar si no se usa, para quitar la sombra.
- Verifica con el inspector que la clase is-active se mueva al cambiar de selección.
¿Tienes dudas sobre eventos, payloads o estilos scoped en Vue.js? Cuéntame tu caso en los comentarios y lo vemos juntos.