13. Syntaxe avancée

1. Clés de boucle

Vous remarquez quelque chose de bizarre ?

Les Pokémons n'apparaissent pas vraiment comme prévu, les premier apparus ont tendance à rester très longtemps affichés...

C'est parce que dans un bloc {#each}, Svelte ne supprime pas réellement les éléments correspondant aux données que nous avons supprimé de notre tableau : il supprime les éléments de la fin du tableau, et ajuste les valeurs.

Ce comportement par défaut permet de grandement faciliter le travail du navigateur pour mettre à jour le DOM. Mais cela pose problème dans certaines situations, où il est important de connaître précisément la position d'un élément dans le tableau.

Pour corriger cela, il faut préciser à chaque élément un identifiant unique, une clé (appelée key) qui identifie précisément et de manière unique l'élément pour toute la durée de sa présence sur la page. Cet identifiant permet à Svelte de savoir avec précision ce qui a besoin d'être inséré ou supprimé dans le DOM lors des mises à jour de tableaux.

{#each person as person (person.id)}
	<p>{person.name}</p>
{/each}

De manière générale, il est recommandé de systématiquement fournir une clé de boucle, même si cela n'est pas strictement nécessaire.

Notez que c'est différent de la syntaxe pour obtenir la position de l'élément dans le tableau :

{#each person as person, position}
	<p>{person.name}</p>
{/each}

Vous pouvez faire les deux simultanément de cette manière :

{#each person as person, position (person.id)}
	<p>{person.name}</p>
{/each}

Les identifiants provenant des bases de données sont souvent utilisés comme clés dans cette situation. N'utilisez surtout pas la position de l'élément dans le tableau, car cette information peut changer pour un même individu, et ne l'identifie donc pas correctement, ce qui va entraîner du travail supplémentaire pour le navigateur.

À vous !
  • Faites en sorte de corriger notre problème d'apparition de Pokémon, en utilisant la bonne valeur comme key.