Comunicación padre-hijo con props en Vue
Clase 27 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
Viendo ahora - 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
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
Aprende a conectar componentes en Vue.js con confianza: de padre a hijo usando props reactivas e inmutables, y de hijo a padre con eventos. Verás cómo estructurar un componente de pista musical con Bulma, corregir el binding con v-bind, optimizar rutas con un alias en webpack y mejorar la UX con un loader controlado por v-show.
¿Cómo se comunican los componentes en Vue.js con props y eventos?
La comunicación fluye en dos direcciones, pero con mecanismos distintos.
- Padre → hijo con props: se envía data por atributos tipo HTML. Son reactivas e inmutables en el hijo. No se deben mutar en el hijo.
- Hijo → padre con eventos: el hijo emite y el padre escucha. Se verá en la siguiente parte, pero conviene distinguirlo desde ahora.
- Reactividad: las props se comportan como
data, actualizan la vista cuando cambian en el padre. - Inmutabilidad en el hijo: preserva el flujo de datos limpio y la coherencia del estado.
- Binding correcto: usa
v-bindo:para pasar valores no literales; sin ello, se envía un string.
Habilidades puestas en práctica: manejo de props, reactividad, inmutabilidad, binding con v-bind, depuración con DevTools de Vue, y lectura de estructuras anidadas que llegan desde una API.
¿Cómo construir y alimentar el componente de track?
Se crea track.vue con el esqueleto de un card de Bulma para mostrar imagen, título, artista y duración. Además, se define la prop track como requerida.
¿Cómo definir las props reactivas?
<script> export default { name: 'PmTrack', props: { track: { type: Object, required: true } } } </script>
- Clave: la prop pertenece al padre; no se muta en el hijo.
¿Cómo renderizar imágenes, título y artista con v-bind?
<template> <div class="card"> <div class="card-image"> <figure class="image is-1by1"> <img :src="track.album.images[0].url" alt="Álbum"> </figure> </div> <div class="card-content"> <div class="media"> <div class="media-left"> <figure class="image is-48x48"> <img :src="track.album.images[0].url" alt="Álbum"> </figure> </div> <div class="media-content"> <p class="title is-6"><strong>{{ track.name }}</strong></p> <p class="subtitle is-6">{{ track.artists[0].name }}</p> </div> </div> <div class="content"> <small>{{ track.duration_ms }}</small> <nav class="level"> <div class="level-left"> <span class="icon">▶️</span> </div> </nav> </div> </div> </div> </template>
- Lectura de datos anidados:
track.album.images[0].url,track.name,track.artists[0].name,track.duration_ms(en milisegundos). - Con DevTools de Vue se detecta rápidamente si se está pasando un string en lugar del objeto.
Uso correcto desde el padre con v-for y v-bind:
<pm-track v-for="t in tracks" :key="t.id" :track="t" />
Si se omite :track="t" y se usa track="t", se pasará el literal "t" y no el objeto.
¿Cómo mejorar la experiencia con alias, responsive y loader?
Se optimiza la importación con alias, se mejora el responsive layout con Bulma y se añade un loader visible solo durante las búsquedas.
¿Cómo importar con alias en webpack?
// webpack.config.js resolve: { alias: { '@': pathResolve('source') } }
- Permite importar con rutas absolutas:
@/components/track.vue. - Tras cambiar el config, reinicia el build para aplicar el alias.
¿Cómo mostrar un loader con v-show e isLoading?
loader.vue reutilizable en components/shared.
<template> <div class="container"> <div class="content has-text-centered"> <h1>Cargando...</h1> </div> </div> </template> <style lang="sass"> .content padding: 20px min-height: 40vh </style>
Registro e inserción controlada desde el padre:
<pm-loader v-show="isLoading" /> <section v-show="!isLoading"> <!-- resultados --> </section>
export default { components: { PmLoader }, data () { return { isLoading: false } } // Al iniciar la búsqueda: this.isLoading = true // Al finalizar la búsqueda: this.isLoading = false }
v-showes ideal cuando se alterna visibilidad con frecuencia, evita montar/desmontar nodos.- El scope de
isLoadinges del componente padre; los hijos no necesitan conocerlo.
Además, el grid de Bulma mejora la UI en desktop sin perder mobile:
<div class="columns is-multiline"> <div class="column is-one-quarter" v-for="t in tracks" :key="t.id"> <pm-track :track="t" /> </div> </div>
is-multilinepara que las tarjetas salten a la siguiente fila.is-one-quarterpara 4 columnas en pantallas grandes.
Conceptos y keywords trabajados: props, eventos, reactividad, inmutabilidad, v-bind, v-show, scope, DevTools, alias de webpack @, UI con Bulma (card, media, image is-48x48), loader reutilizable en shared, prefijo PM para componentes.
¿Te quedó alguna duda o quieres compartir cómo estructuraste tus props y el loader? Comenta y seguimos la conversación.