Eventos con detalles

Los eventos que fabriquemos con un event dispatcher también nos permiten agregarle información extra que puede ser capturada en el listener de los eventos, lo que nos va a permitir enviar información extra cuando hagamos fluir eventos de un sitio a otro.

Este curso ha sido marcado como anticuado y no está siendo revisado de forma activa. Es posible que la información pueda estar desactualizada o que los enlaces se hayan roto.

Cuando trabajamos con eventos en JavaScript, especialmente en frameworks como Svelte, es fundamental entender cómo se propagan y cómo podemos aprovechar la información que llevan consigo. En muchas ocasiones, al definir un manejador de eventos, podemos omitir explícitamente los parámetros, pero detrás de escena siempre existe un parámetro implícito llamado event que contiene toda la información relevante sobre el evento que acaba de ocurrir.

Al inspeccionar este objeto event, podemos ver detalles como el tipo de evento, el elemento que lo disparó (target), y un campo muy interesante llamado detail. Este campo detail es especialmente útil porque nos permite enviar datos adicionales junto con el evento, algo que no está disponible por defecto pero que puede enriquecer la comunicación entre componentes.

Por ejemplo, imaginemos que queremos enviar la fecha y hora exacta en la que se ha producido un evento. Podemos crear un objeto detail que incluya esta información y pasarla cuando disparamos el evento. En Svelte, esto se hace mediante el método dispatch que acepta como segundo parámetro un objeto con la propiedad detail. Así, cuando el evento se propaga, quien lo reciba podrá acceder a esa información extra a través de event.detail.

Veamos un ejemplo práctico de cómo implementar esto. Supongamos que tenemos un botón que, al pulsarlo, dispara un evento personalizado con la fecha actual incluida en detail:

import { createEventDispatcher } from 'svelte';

const dispatch = createEventDispatcher();

function handleClick() {
  const fecha = new Date().toLocaleString();
  dispatch('pulsado', { detail: { fecha } });
}

En el componente padre o en quien escuche este evento, podemos capturar esa fecha desde event.detail.fecha y utilizarla para actualizar un array de fechas que mostramos en pantalla. Sin embargo, hay un detalle importante a tener en cuenta en Svelte: para que la actualización del array sea detectada y se reactive la reactividad, no basta con usar métodos mutativos como push. En lugar de eso, debemos crear un nuevo array que incluya los elementos anteriores más el nuevo, y asignarlo de nuevo a la variable. Esto asegura que Svelte detecte el cambio y actualice la interfaz.

Por ejemplo, si tenemos una variable fechas que es un array, para añadir una nueva fecha haríamos algo así:

fechas = [...fechas, event.detail.fecha];

Esto es preferible a hacer simplemente fechas.push(event.detail.fecha), porque Svelte no detecta cambios en arrays si no hay una asignación explícita.

Este mecanismo de enviar datos adicionales con event.detail es muy útil en situaciones más complejas, como cuando queremos comunicar que un formulario ha sido enviado y además pasar los datos que el usuario ha introducido. Así, el componente que recibe el evento puede procesar esa información, enviarla a un servidor o realizar cualquier otra acción necesaria.

Además del parámetro detail, el método dispatch acepta un tercer parámetro llamado options, que permite configurar aspectos como si el evento es cancelable, pero esto suele ser más relevante para la lógica interna del motor y no es algo que usemos habitualmente en la mayoría de los casos.

Por último, es importante recordar que en Svelte los eventos personalizados se propagan hacia el componente inmediatamente superior, lo que tiene implicaciones en cómo diseñamos la comunicación entre componentes y cómo gestionamos la propagación de eventos. Este tema merece una atención especial y puede ser motivo de análisis más detallados para entender mejor su comportamiento y optimizar nuestras aplicaciones.

Lista de reproducción
  1. 1
    ¿Qué es Svelte?
    9 minutos
  2. 2
    ¿Cómo crear un proyecto de Svelte?
    7 minutos
  3. 3
    Creando nuestro primer componente
    7 minutos
  4. 4
    Datos dinámicos y props
    7 minutos
  5. 5
    Anidando componentes
    7 minutos
  6. 6
    Capturando eventos
    7 minutos
  7. 7
    Eventos y reactividad
    8 minutos
  8. 8
    Atributos condicionales e IF
    9 minutos
  9. 9
    Bucles
    11 minutos
  10. 10
    Bloques await
    7 minutos
  11. 11
    Bind
    8 minutos
  12. 12
    bind:this
    6 minutos
  13. 13
    ¿Para qué nos sirve un evento personalizado?
    6 minutos
  14. 14
    createEventDispatcher
    6 minutos
  15. 15
    Eventos con detalles
    7 minutos
  16. 16
    Reenviando eventos
    6 minutos
  17. 17
    Ejemplo de eventos (primera parte)
    12 minutos
  18. 18
    Ejemplo de eventos (y segunda parte)
    16 minutos
  19. 19
    Modificadores de eventos
    6 minutos
  20. 20
    Fundamentos del CSS con Svelte
    9 minutos
  21. 21
    Clases condicionales
    7 minutos
  22. 22
    Estilos en línea y variables CSS
    8 minutos
  23. 23
    Estilos globales
    6 minutos
  24. 24
    Importar hojas de estilo externas
    5 minutos
  25. 25
    Reactividad experta con el operador $
    8 minutos
  26. 26
    Slots (parte 1 de 2)
    5 minutos
  27. 27
    Slots (parte 2 de 2)
    7 minutos
  28. 28
    Directivas svelte:window, svelte:head, svelte:body
    4 minutos
  29. 29
    Actualizar de Rollbar a Vite 3
    11 minutos
  30. 30
    Exportar a Web Components
    10 minutos
  31. 31
    Integrar TypeScript, SCSS, PostCSS...
    8 minutos
  32. 32
    Hasta aquí (por ahora)
    3 minutos
  33. 33
    Lo que se viene con Svelte 5
    13 minutos