Skip to main content
Bases de Svelte
Introduction
Réactivité
Props
Logique
Events
Bindings
Classes and styles
Actions
Transitions
Advanced Svelte
Advanced reactivity
Reusing content
Motion
Advanced bindings
Advanced transitions
Context API
Special elements
<script module>
Next steps
Basic SvelteKit
Introduction
Routing
Loading data
Headers and cookies
Shared modules
Forms
API routes
$app/state
Errors and redirects
Advanced SvelteKit
Hooks
Page options
Link options
Advanced routing
Advanced loading
Environment variables
Conclusion

Par défaut, lorsque vous modifiez la value d’un bloc #each, Svelte va ajouter et supprimer les noeuds du DOM à la fin du bloc, et mettre à jour toute valeur ayant changé. Ceci peut ne pas être ce que vous voulez.

Ce genre de problématique est plus facile à montrer qu’à expliquer. Dans Thing.svelte, name est une prop dynamique, but emoji est une constante.

Cliquez sur le bouton Supprimer le premier élément plusieurs fois, et notez ce qu’il se passe :

  1. Le dernier composant est supprimé.
  2. La valeur de name est ensuite mise à jour dans les noeuds restants du DOM, mais pas l’emoji.

Si vous venez de React, ceci peut vous paraître étrange, car vous êtes habitué•e au re-rendu complet du composant lorsque l’état change. Svelte fonctionne différemment : le composant est “joué” une seule fois, et les mises à jour suivantes sont “chirurgicales”. Ceci permet d’accélérer les rendus et vous donne plus de contrôle.

Une façon de corriger ce problème pourrait être de transformer l’emoji en une valeur $derived. Mais il est plus logique de supprimer uniquement le premier composant <Thing> plutôt que de supprimer le dernier et de mettre à jour tous les autres.

Pour faire cela, nous devons préciser une clé unique pour chaque itération du bloc each :

App
{#each things as thing (thing.id)}
	<Thing name={thing.name}/>
{/each}

Vous pouvez utiliser n’importe quel objet comme clé, puisque Svelte utilise une Map en interne — autrement dit vous pourriez écrire (thing) au lieu de (thing.id). Néanmoins, utiliser une chaîne de caractères ou un nombre est en général plus sécurisé, puisque cela permet de faire persister l’identité des éléments même si les références des objets changent, par exemple lorsque vous rafraîchissez les données depuis un serveur d’API.

Modifier cette page sur Github

précédent suivant
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<script>
	import Thing from './Thing.svelte';
 
	let things = $state([
		{ id: 1, name: 'pomme' },
		{ id: 2, name: 'banane' },
		{ id: 3, name: 'carotte' },
		{ id: 4, name: 'donut' },
		{ id: 5, name: 'oeuf' }
	]);
</script>
 
<button onclick={() => things.shift()}>
	Supprimer le premier élément
</button>
 
{#each things as thing}
	<Thing name={thing.name} />
{/each}