Eventos personalizados en Vue: comunicar hijo a padre

Clase 28 de 37Curso de Reactividad con Vue.js 3

Resumen

Crear eventos personalizados en Vue con la Options API permite resolver errores comunes de estado y habilitar una comunicación clara de hijo a padre. Aquí verás cómo usar emits, la función interna emit, y cómo escuchar el evento en el padre con v-on (o @) para que funciones como add to cart trabajen con datos correctos y mantengan la reactividad.

¿Cómo se soluciona el error de add to cart desde el hijo?

Intentar ejecutar add to cart desde el hijo fallaba porque accedía a estado no disponible en ese componente: el estado vive en el padre. La solución es mover la inserción al padre y, desde el hijo, emitir un evento con el producto.

  • Crear en el hijo un método llamado send to cart que no muta estado.
  • En el padre, mantener add to cart para insertar en el estado global de la aplicación.
  • Pasar el producto como parámetro: el padre recibe y agrega al carrito.
  • Evitar referencias como this.product en el hijo: usar el parámetro product.
  • Continuar usando eventos de JavaScript nativos como click, mouseover, mouseenter o keyup cuando apliquen.

¿Qué cambia en el método add to cart?

  • Ahora recibe un producto como argumento.
  • Deja de leer del estado interno del hijo.
  • Inserta directamente el producto recibido en el carrito del padre.

¿Cómo definir y emitir eventos personalizados con emits y emit?

Para comunicar del hijo al padre se define un evento propio con la opción emits y luego se dispara con emit desde un método.

  • Declarar en el componente hijo la opción emits con el nombre del evento: send to cart.
  • Implementar el método send to cart en el hijo.
  • Usar la función interna emit para emitir el evento con un payload.
  • Enviar como payload el producto, tal como se acordó.
  • Mantener el mismo nombre del evento en emits y al emitir.

¿Qué datos viajan en el evento?

  • Viaja el producto en sí mismo como información del evento.
  • El padre lo recibe y lo inserta en el carrito mediante add to cart.

¿Cómo escuchar el evento con v-on (@) y mantener la reactividad?

En la vista del padre, donde se recorre la lista de productos, el componente hijo ahora expone un evento personalizado. Se escucha con v-on o con el atajo @ y se ejecuta la función del padre.

  • Escuchar el evento del hijo: @send to cart.
  • Ejecutar add to cart al ocurrir el evento.
  • Pasar $event: Vue reemplaza por el producto emitido.
  • Todo sigue siendo reactivo: descuentos aplicados en el hijo se reflejan en el padre.
  • Agregar múltiples productos funciona de forma consistente.
  • Aplicar códigos de descuento a distintos productos mantiene el estado coherente.

¿Tienes dudas sobre emits, emit, v-on o la separación entre hijo y padre al manejar el carrito? Comparte tu caso en los comentarios y lo revisamos juntos.