## `$state` Utilisez uniquement la rune `$state` pour des variables qui ont besoin d'être _réactives_ — en d'autres mots, pour des variables qui peuvent provoquer la mise à jour d'un `$effect`, d'un `$derived` ou d'expressions de templates. Tout le reste peut être une variable normale. Les tableaux et les objets (`$state({...})` ou `$state([...])`) sont rendus profondément réactifs, ce qui signifie que leur mutation va déclencher des mises à jour. Ceci a une contrepartie : en échange d'une réactivité fine, les objets doivent être transformés en proxies, ce qui implique un surcoût en performances. Dans les cas où vous travaillez sur de gros objets qui ne sont que réassignés (plutôt que mutés), utilisez plutôt `$state.raw`. C'est souvent le cas avec les réponses d'API, par exemple. ## `$derived` Pour calculer quelque chose depuis un état, utilisez `$derived` plutôt que `$effect` : ```js // @errors: 2451 let num = 0; // ---cut--- // faites ceci let square = $derived(num * num); // ne faites pas ceci let square; $effect(() => { square = num * num; }); ``` > [!NOTE] On fournit à `$derived` une expression, et _pas_ une fonction. Si vous devez utiliser une > fonction (car l'expression est complexe, par exemple), utilisez `$derived.by`. Les dérivées sont modifiables — vous pouvez leur assigner des valeurs, comme avec `$state`, mais elles seront ré-évaluées lorsque leur expression sera mise mise à jour. Si l'expression dérivée est un objet ou un tableau, celui-ci sera renvoyé tel quel — il ne sera _pas_ rendu profondément réactif. Vous pouvez toutefois utilisez `$state` dans `$derived.by` dans les rares cas où vous en auriez besoin. ## `$effect` Les effets sont un outil de dernier recours et devraient être évités si possible. En particulier, évitez de mettre à jour un état dans un effet. - Si vous avez besoin de vous synchroniser avec une librairie externe comme D3, il est souvent plus simple d'utiliser [`{@attach ...}`](@attach) - Si vous avez besoin d'exécuter du code en réponse à une interaction utilisateur, mettez le code directement dans un gestionnaire d'évènement ou utilisez une [liaison de fonction](bind#Function-bindings), selon ce qui est le plus approprié - Si vous avez besoin de logguer des valeurs pour déboguer, utiliser [`$inspect`]($inspect) - Si vous avez besoin d'observer quelque chose d'externe à Svelte, utilisez [`createSubscriber`](svelte-reactivity#createSubscriber) N'entourez jamais le contenu d'un effet avec `if (browser) {...}` ou similaire — les effets ne sont jamais exécutés sur le serveur. ## `$props` Traitez les props comme si elles ne changeaient jamais. Par exemple, les valeurs qui dépendent de props devraient en général être des `$derived` : ```js // @errors: 2451 let { type } = $props(); // faites ceci let color = $derived(type === 'danger' ? 'red' : 'green'); // ne faites pas ceci — `color` ne sera jamais mise à jour si `type` change let color = type === 'danger' ? 'red' : 'green'; ``` ## `$inspect.trace` `$inspect.trace` est un outil de déboguage pour la réactivité. Si quelque chose ne se met pas correctement à jour ou est exécuté plus souvent que nécessaire, vous pouvez ajouter `$inspect.trace(label)` en tant que première ligne d'un `$effect` ou d'un `$derived.by` (ou de n'importe quelle fonction appelée par l'un d'eux) pour tracer leurs dépendances et trouver lequel déclenche une mise à jour. ## Évènements [!VO]Events Tout attribut d'élément commençant par `on` est traité comme un gestionnaire d'évènement : ```svelte ``` Si vous avez besoin d'attacher des gestionnaires à `window` ou `document` vous pouvez utiliser `` et `` : ```svelte ``` Évitez d'utiliser `onMount` ou `$effect` pour faire cela. ## Snippets [Snippets](snippet) sont une manière de définir des morceaux de markup réutilisables pouvant être instanciés avec la balise [`{@render ...}`](@render), ou passés en tant que props de composants. Ils doivent être déclarés au sein du template. ```svelte {#snippet greeting(name)}

bonjour {name} !

{/snippet} {@render greeting('tout le monde')} ``` > [!NOTE] Les snippets déclarés à la racine d'un composant (c-à-d pas dans des éléments ou des > blocs) peuvent être référencés au sein d'un `