Ejemplo de eventos (primera parte)

En los próximos dos episodios haremos una pequeña demo creando un formulario complejo con Svelte para demostrar las capacidades a la hora de crear eventos. En esta primera parte creamos el esqueleto de la aplicación y los componentes más sencillos.

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.

Vamos a crear un formulario interactivo en Svelte que nos permita introducir datos para una persona que busca trabajo, como nombre, apellidos, tipo de trabajo y rango salarial. La idea es construir este formulario pensando en eventos personalizados, para practicar cómo crear, exponer y propagar eventos que modifiquen un estado global con los datos introducidos. También veremos cómo enviar datos hacia abajo para mantener todo sincronizado.

Para empezar, creamos un proyecto nuevo con la estructura actualizada de Svelte y eliminamos componentes que no vamos a usar, como el contador por defecto. Montamos un servidor de desarrollo para ir viendo los cambios en tiempo real. Lo primero es maquetar el formulario usando la etiqueta semántica <form>, que aunque no vayamos a enviar datos por HTTP, nos permite manejar eventos como submit de forma accesible y estándar.

Definimos una función llamada envío que se ejecutará al enviar el formulario. En esta función, por ahora, simplemente mostraremos un alert con el estado actual de los datos, que es un objeto llamado estado con propiedades como nombre, apellido, sector y un rango salarial con valores mínimos y máximos. Por ejemplo:

let estado = {
  nombre: 'Pepita',
  apellido: 'Flores',
  sector: 'frontend',
  salario: {
    min: 25000,
    max: 45000
  }
};

function envío(event) {
  event.preventDefault();
  alert(JSON.stringify(estado));
}

Es importante usar event.preventDefault() para evitar que el formulario recargue la página al enviarse, permitiéndonos controlar el comportamiento con JavaScript.

Para los campos de texto, como nombre y apellido, usamos inputs vinculados con bind:value a las propiedades del estado. Además, por accesibilidad, cada input debe tener un label asociado con el atributo for que coincida con el id del input. Por ejemplo:

<p>
  <label for="nombre">Nombre</label>
  <input id="nombre" type="text" bind:value={estado.nombre} />
</p>
<p>
  <label for="apellido">Apellido</label>
  <input id="apellido" type="text" bind:value={estado.apellido} />
</p>

Sin embargo, repetir este patrón para cada campo puede ser tedioso y propenso a errores, especialmente al mantener sincronizados los atributos id y for. Por eso, creamos un componente reutilizable llamado Input.svelte que encapsula esta lógica y nos permite pasarle las propiedades necesarias.

En Input.svelte exportamos las propiedades identifier, label y value. Usamos identifier para asignar el id del input y el for del label, y value para el binding bidireccional con bind:value. El truco está en exportar value y usar bind:value sin asignarlo directamente, lo que permite que el componente soporte el binding desde el padre y propague los cambios hacia arriba automáticamente.

<script>
  export let identifier;
  export let label;
  export let value;
</script>

<p>
  <label for={identifier}>{label}</label>
  <input id={identifier} type="text" bind:value />
</p>

Luego, en el componente principal importamos este Input y lo usamos para los campos de nombre y apellido, pasando el identifier, el label y enlazando el value con las propiedades del estado:

<script>
  import Input from './Input.svelte';

  let estado = {
    nombre: 'Pepita',
    apellido: 'Flores',
    sector: 'frontend',
    salario: {
      min: 25000,
      max: 45000
    }
  };

  function envío(event) {
    event.preventDefault();
    alert(JSON.stringify(estado));
  }
</script>

<form on:submit={envío}>
  <Input identifier="nombre" label="Nombre" bind:value={estado.nombre} />
  <Input identifier="apellido" label="Apellido" bind:value={estado.apellido} />
  <p><input type="submit" value="Enviar" /></p>
</form>

Este enfoque nos permite reducir la duplicación de código y mantener la lógica de los inputs centralizada. Además, gracias al binding en cadena, cualquier cambio en los inputs se refleja inmediatamente en el estado global, y al enviar el formulario podemos acceder a los datos actualizados.

Así, hemos construido la base de un formulario accesible, semántico y reactivo en Svelte, con componentes reutilizables y manejo personalizado de eventos para controlar el envío sin recargar la página. En siguientes pasos podremos añadir los desplegables y sliders para completar la interfaz.

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