Skip to main content

{#each ...}

{#each expression as name}...{/each}
{#each expression as name, index}...{/each}

Vous pouvez itérer sur des valeurs en utilisant un bloc #each. Les valeurs en questions peuvent être des tableaux, des objets similaires à des tableaux (c-à-d tout ce qui possède une propriété length), ou des itérables comme Map et Set — autrement dit, tout ce qui peut être utilisé avec Array.from.

<h1>Shopping list</h1>
<ul>
	{#each items as item}
		<li>{item.name} x {item.qty}</li>
	{/each}
</ul>

Un bloc #each peut également préciser un index, correspondant au deuxième argument d’un callback array.map(...).

{#each items as item, i}
	<li>{i + 1}: {item.name} x {item.qty}</li>
{/each}

Les blocs each à clé

{#each expression as name (key)}...{/each}
{#each expression as name, index (key)}...{/each}

Si une expression key est fournie — qui se doit d’identifier de manière unique chaque élément de la liste — Svelte va s’en servir pour remplacer finement les éléments de la liste lorsque celle-ci change, plutôt que d’ajouter ou supprimer les éléments à la fin. La clé (key) peut être n’importe quel objet, mais les chaînes de caractères et les nombres sont recommandés car il permettent à l’identité de persister lorsque les objets eux-mêmes changent.

{#each items as item (item.id)}
	<li>{item.name} x {item.qty}</li>
{/each}

<!-- ou avec la valeur d'index additionnelle -->
{#each items as item, i (item.id)}
	<li>{i + 1}: {item.name} x {item.qty}</li>
{/each}

Vous pouvez déstructurer librement ou utiliser comme bon vous semble le paramètre de reste dans les blocs #each.

{#each items as { id, name, qty }, i (id)}
	<li>{i + 1}: {name} x {qty}</li>
{/each}

{#each objects as { id, ...rest }}
	<li><span>{id}</span><MyComponent {...rest} /></li>
{/each}

{#each items as [id, ...rest]}
	<li><span>{id}</span><MyComponent values={rest} /></li>
{/each}

Blocs each sans élément

{#each expression}...{/each}
{#each expression, index}...{/each}

Dans le cas où vous souhaitez uniquement afficher quelque chose n fois, vous pouvez omettre le as (demo):

<div class="chess-board">
	{#each { length: 8 }, rank}
		{#each { length: 8 }, file}
			<div class:black={(rank + file) % 2 === 1}></div>
		{/each}
	{/each}
</div>

Blocs else

{#each expression as name}...{:else}...{/each}

Un bloc #each peut également avoir une clause {:else}, qui sera affichée si la liste est vide.

{#each todos as todo}
	<p>{todo.text}</p>
{:else}
	<p>Rien à faire aujourd'hui !</p>
{/each}

Modifier cette page sur Github

précédent suivant