Reenviando eventos

Para terminar con el tema eventos, es posible repropagar eventos hacia arriba en la jerarquía de un componente significativo de Svelte si simplemente utilizamos el atributo on, pero no le damos ningún valor. Un ejemplo será mejor que mil palabras.

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 Svelte y construimos aplicaciones con múltiples componentes anidados, la comunicación entre ellos puede complicarse, especialmente cuando queremos que los eventos personalizados se propaguen hacia arriba en la jerarquía. En este contexto, es fundamental entender cómo reenviar eventos para que los componentes superiores puedan reaccionar adecuadamente sin necesidad de escribir código repetitivo.

Imaginemos una estructura donde tenemos una aplicación principal que contiene un componente llamado Botonera, y dentro de esta Botonera hay dos botones: uno es un botón simple de reinicio y el otro es un componente Svelte personalizado que ya habíamos creado anteriormente. La jerarquía sería algo así: la aplicación principal contiene la Botonera, y esta a su vez contiene ambos botones.

Cuando pulsamos el botón personalizado, este dispara un evento llamado pulsado. Este evento es capturado por la Botonera, pero esta no tiene la lógica para manejarlo directamente, ya que la variable que controla el número de pulsaciones está en la aplicación principal. Por lo tanto, necesitamos que la Botonera reenvíe ese evento hacia arriba para que la aplicación principal pueda incrementar el contador.

De manera similar, el botón de reinicio debe emitir un evento reinicio que también debe propagarse hasta la aplicación principal para que esta pueda resetear el contador a cero.

Una forma tradicional de reenviar estos eventos es que cada componente intermedio escuche el evento y, a su vez, dispare otro evento hacia arriba. Por ejemplo, en la Botonera podríamos tener algo así:

<script>
  import { createEventDispatcher } from 'svelte';
  const dispatch = createEventDispatcher();

  function reenviarPulsado() {
    dispatch('pulsado');
  }

  function reenviarReinicio() {
    dispatch('reinicio');
  }
</script>

<Boton on:pulsado={reenviarPulsado} />
<button on:click={reenviarReinicio}>Reiniciar</button>

Aquí, cuando el botón personalizado emite pulsado, la Botonera lo captura y ejecuta reenviarPulsado, que a su vez dispara el evento pulsado hacia arriba. Lo mismo ocurre con el botón de reinicio.

Sin embargo, esta técnica implica escribir funciones que simplemente vuelven a emitir eventos, lo que puede resultar tedioso y repetitivo, especialmente en jerarquías profundas.

Afortunadamente, Svelte nos ofrece una forma mucho más sencilla para reenviar eventos sin necesidad de escribir funciones intermedias. Si en la Botonera ponemos directamente el manejador del evento sin especificar una función, Svelte automáticamente reemitirá ese evento hacia arriba. Por ejemplo:

<Boton on:pulsado />
<button on:reinicio />

En este caso, al no asignar ninguna función al evento, Svelte entiende que debe propagar el evento hacia el componente padre. Esto funciona porque cuando un evento personalizado llega a un componente que no tiene lógica para manejarlo, Svelte lo eleva automáticamente para que otro componente más arriba pueda reaccionar.

Esta característica nos permite reducir significativamente la cantidad de código necesario para manejar eventos en jerarquías complejas. Así, la aplicación principal puede escuchar directamente los eventos pulsado y reinicio y actualizar el estado correspondiente sin que los componentes intermedios tengan que intervenir más que para reenviar los eventos.

En resumen, al construir aplicaciones con múltiples niveles de componentes en Svelte, podemos aprovechar esta capacidad de reenviar eventos automáticamente para mantener nuestro código limpio y evitar funciones repetitivas que solo se encargan de propagar eventos hacia arriba. Esto facilita la comunicación entre componentes y nos permite centrarnos en la lógica de negocio en lugar de en la gestión de eventos.

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