La rune `$state` vous permet de créer un _état réactif_, ce qui signifie que votre UI _réagit_
lorsque cet état évolue.
```svelte
```
À la différence d'autres frameworks que vous avez peut-être croisés, il n'y a pas d'API pour
interagir avec un état — `count` est juste un nombre, et non un objet ou une fonction, et vous
pouvez le mettre à jour comme vous mettriez à jour n'importe quelle variable.
### L'état profond [!VO]Deep state
Si `$state` est utilisé avec un tableau ou un objet simple, le résultat est un _proxy d'état_
profondément réactif. Les
[Proxys](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Proxy)
permettent à Svelte d'exécuter du code lors de la lecture ou de l'écriture de propriétés, en
particulier via des méthodes comme `array.push(...)`, déclenchant des mises à jour granulaires.
> [!NOTE] Les classes comme `Set` et `Map` ne seront pas transformées en Proxy, mais Svelte fournit
> des implémentations réactives pour plusieurs built-ins similaires que vous pouvez importer depuis
> [`svelte/reactivity`](./svelte-reactivity).
L'état est transformé en Proxy de manière récursive jusqu'à ce que Svelte trouve autre chose qu'un
tableau ou un objet simple. Dans un cas comme celui-là...
```js
let todos = $state([
{
done: false,
text: 'ajouter plus de todos'
}
]);
```
... modifier une propriété d'un élément individuel du tableau va déclencher des mises à jour pour
tous les éléments de votre UI qui dépendent spécifiquement de cette propriété :
```js
let todos = [{ done: false, text: 'add more todos' }];
// ---cut---
todos[0].done = !todos[0].done;
```
Si vous ajoutez un nouvel objet à ce tableau via `.push`, celui-ci sera également transformé en
Proxy :
```js
let todos = [{ done: false, text: 'add more todos' }];
// ---cut---
todos.push({
done: false,
text: 'déjeuner'
});
```
> [!NOTE] Lorsque vous mettez à jour les propriétés d'un Proxy, l'objet d'origine n'est _pas_ muté.
Notez que si vous déstructurez une valeur réactive, les références ne sont pas réactives — comme
pour du JavaScript classique, elles sont évaluées au moment de la déstructuration :
```js
let todos = [{ done: false, text: 'ajouter plus de tâches' }];
// ---cut---
let { done, text } = todos[0];
// ceci n'affectera pas la valeur de `done`
todos[0].done = !todos[0].done;
```
### Classes
Vous pouvez aussi utiliser `$state` avec les champs d'une classe (qu'ils soient publics ou privés) :
```js
// @errors: 7006 2554
class Todo {
done = $state(false);
text = $state();
constructor(text) {
this.text = text;
}
reset() {
this.text = '';
this.done = false;
}
}
```
Lorsque vous appelez des méthodes en JavaScript, la valeur de
[`this`](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Operators/this) a de
l'importance. L'exemple suivant ne fonctionne pas, car la référence `this` dans la méthode `reset`
est le `