## `$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 `