Bind

Con bind tenemos una forma de asociar bidireccionalmente un atributo de un elemento con una variable. Por ejemplo, si le asociamos un bind a un input box, podemos hacer que se actualice cada vez que cambia el valor de una variable, y que simultáneamente actualice la variable cuando cambie el contenido del input.

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.

En el desarrollo con Svelte, uno de los aspectos que más nos facilita la vida es el sistema de binding, que nos permite sincronizar de forma sencilla y bidireccional los valores de los inputs con las variables de nuestra aplicación. Esto optimiza el manejo de eventos y simplifica enormemente nuestro código, evitando tener que escribir manualmente la lógica para actualizar variables cada vez que el usuario interactúa con un formulario.

Para entender cómo funciona, imaginemos que tenemos una variable llamada nombre cuyo valor inicial es "luna". Queremos mostrar este valor en pantalla y, además, permitir que el usuario lo modifique a través de un campo de texto. La forma tradicional sería asignar el valor de nombre al atributo value del input, pero esto solo nos permite mostrar el valor inicial; si el usuario cambia el texto, la variable nombre no se actualiza automáticamente.

Podríamos entonces capturar eventos como keyup para detectar cuando el usuario escribe y actualizar manualmente la variable, algo así:

<script>
  let nombre = "luna";
</script>

<input value={nombre} on:keyup={e => nombre = e.target.value} />
<p>Tu nombre es {nombre}</p>

Aunque funciona, escribir este tipo de código repetidamente puede ser tedioso y propenso a errores. Aquí es donde entra en juego el binding de Svelte. Utilizando bind:value={nombre}, conseguimos que el valor del input y la variable nombre estén sincronizados automáticamente en ambas direcciones. Esto significa que el input mostrará el valor inicial de nombre, y cualquier cambio que haga el usuario actualizará la variable sin necesidad de manejar eventos explícitos.

El código se simplifica a:

<script>
  let nombre = "luna";
</script>

<input bind:value={nombre} />
<p>Tu nombre es {nombre}</p>

Este patrón no solo funciona con inputs de texto, sino que es aplicable a muchos otros tipos de campos. Por ejemplo, para un checkbox podemos usar bind:checked para enlazar una variable booleana con el estado marcado o desmarcado del checkbox. Si tenemos una variable acepta que inicialmente es false, podemos mostrar un mensaje diferente según su valor y controlar el checkbox con binding:

<script>
  let acepta = false;
</script>

<label>
  <input type="checkbox" bind:checked={acepta} />
  Modificar mi valor
</label>

<p>{acepta ? "Nos ha dicho que sí" : "Nos dice que no"}</p>

De esta forma, al marcar o desmarcar el checkbox, la variable acepta se actualiza automáticamente y el mensaje cambia en consecuencia.

Otro caso común es el uso de un select para elegir entre varias opciones. Podemos tener una variable valor que almacena la opción seleccionada y un array con los valores disponibles, por ejemplo, continentes del mundo. Usando bind:value={valor} en el select, conseguimos que la variable se actualice cuando el usuario cambia la selección, y que el select muestre la opción correspondiente al valor inicial.

<script>
  let valor = "Asia";
  let valores = ["Asia", "Europa", "América", "África", "Oceanía"];
</script>

<select bind:value={valor}>
  {#each valores as v}
    <option value={v}>{v}</option>
  {/each}
</select>

<p>Has seleccionado: {valor}</p>

Es importante tener en cuenta que, si trabajamos con arrays de objetos o datos que pueden no estar disponibles inmediatamente (por ejemplo, cargados desde una API), debemos manejar con cuidado los valores para evitar errores al acceder a propiedades indefinidas.

Cada tipo de input en HTML tiene su propio binding específico en Svelte, lo que hace que esta técnica sea muy versátil y aplicable a la mayoría de los casos en los que necesitamos sincronizar datos entre la interfaz y la lógica de nuestra aplicación. Para profundizar en todos los bindings disponibles, es recomendable consultar la documentación oficial de Svelte, donde encontraremos una lista completa y ejemplos detallados.

En definitiva, el sistema de binding en Svelte nos permite escribir código más limpio, reactivo y fácil de mantener, evitando la necesidad de gestionar manualmente eventos y actualizaciones de estado en nuestros formularios y componentes interactivos.

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