Bucles

Con los bucles podemos insertar directivas en nuestros componentes Svelte para repetir parte de un marcado un número de veces en función del número de elementos que haya en una colección que vamos a ir recorriendo. Además, no te olvides que también tiene else para establecer el marcado en caso de que no haya elementos sobre los que iterar.

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 Svelte, podemos aprovechar la lógica de templates para crear bucles que nos permitan iterar sobre arrays y renderizar sus elementos de forma dinámica en el navegador. Esto es especialmente útil cuando queremos mostrar listas de datos, ya sean simples cadenas de texto o estructuras más complejas como objetos con múltiples propiedades.

Para construir un bucle en Svelte, utilizamos el bloque each. La sintaxis comienza con una almohadilla seguida de la palabra each, y dentro de corchetes indicamos el array que queremos recorrer y la variable local que representará a cada elemento en cada iteración. Por ejemplo, si tenemos un array llamado elementos compuesto por strings, podemos escribir:

{#each elementos as e}
  <p>{e}</p>
{/each}

Esto hará que se genere un párrafo por cada elemento del array, mostrando su contenido. Pero no estamos limitados a estructuras simples; podemos anidar etiquetas HTML para crear una estructura más compleja, como un div con un strong y un span para mostrar la información de manera más detallada.

Además, el bloque each nos permite capturar el índice de cada iteración. Para ello, añadimos una segunda variable separada por una coma después de la variable del elemento. Por ejemplo:

{#each elementos as e, num}
  <p>Tarea {num + 1}: {e}</p>
{/each}

Aquí, num representa el índice de la iteración, comenzando en 0, y podemos usarlo para numerar las tareas o elementos que estamos mostrando.

Cuando trabajamos con arrays de objetos, podemos crear componentes hijos que reciban las propiedades de cada objeto para renderizarlas de forma personalizada. Por ejemplo, si tenemos un componente Tarea que recibe nombre y terminado como props, podemos mostrar la tarea con un estilo diferente según su estado:

<script>
  export let nombre;
  export let terminado;
</script>

{#if terminado}
  <p style="text-decoration: line-through;">✔️ {nombre}</p>
{:else}
  <p>{nombre}</p>
{/if}

Luego, en el componente padre, podemos iterar sobre un array de objetos que representen tareas, pasando las propiedades correspondientes a cada instancia del componente:

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

  let tareas = [
    { id: 1, nombre: 'Comprar patatas', terminado: true },
    { id: 2, nombre: 'Limpiar el jardín', terminado: false },
    { id: 3, nombre: 'Enviar correo', terminado: false },
    { id: 4, nombre: 'Llamar a Lucía', terminado: true }
  ];
</script>

{#each tareas as tarea (tarea.id)}
  <Tarea nombre={tarea.nombre} terminado={tarea.terminado} />
{/each}

Un aspecto importante al iterar sobre listas en Svelte es el uso de la key. Esta clave única, que suele ser un identificador propio de cada elemento, ayuda a Svelte a optimizar la actualización del DOM cuando el array cambia. Si no especificamos una key, Svelte usará el índice del array por defecto, lo que puede causar problemas al modificar la lista, como que se actualicen elementos incorrectos o que el orden se descontrole.

Por eso, es recomendable siempre proporcionar una key única, como el id de cada tarea, para que Svelte pueda identificar correctamente cada elemento y actualizar solo lo necesario.

Finalmente, Svelte ofrece una forma sencilla de manejar el caso en que el array esté vacío. Podemos añadir un bloque else dentro del each para mostrar un mensaje alternativo cuando no haya elementos que iterar. Por ejemplo:

{#each tareas as tarea (tarea.id)}
  <Tarea nombre={tarea.nombre} terminado={tarea.terminado} />
{:else}
  <p>No tienes nada que hacer hoy. Disfruta.</p>
{/each}

Así, si el array tareas está vacío, en lugar de mostrar una lista vacía, aparecerá el mensaje que hemos definido, mejorando la experiencia del usuario.

Con estas herramientas, podemos manejar listas en Svelte de forma eficiente y elegante, adaptándonos a diferentes tipos de datos y situaciones.

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