The `$state` 符文允许您创建 *响应式状态*,这意味着当它改变时,您的 UI *会响应*。
```svelte
```
与您可能遇到的其他框架不同,没有用于与状态交互的 API —— `count` 只是一个数字,而不是一个对象或函数,您可以像更新任何其他变量一样更新它。
深层政府
如果使用 `$state` 与数组或简单对象一起,结果将是一个深度响应的 *状态代理*。 [代理](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy) 允许 Svelte 在读取或写入属性时运行代码,包括通过 `array.push(...)` 等方法,从而触发细粒度更新。
状态递归代理,直到 Svelte 找到除了数组或简单对象(如类或使用`Object.create`创建的对象)之外的内容。在这种情况下...
```js
let todos = $state([
{
done: false,
text: 'add more todos'
}
]);
```
修改单个待办事项的属性将触发依赖于该特定属性的 UI 中任何内容的更新:
```js
let todos = [{ done: false, text: 'add more todos' }];
// ---cut---
todos[0].done = !todos[0].done;
```
如果您向数组中推送一个新的对象,它也将被代理:
```js
let todos = [{ done: false, text: 'add more todos' }];
// ---cut---
todos.push({
done: false,
text: 'eat lunch'
});
```
> \[!注意\] 当您更新代理属性时,原始对象*不会被*修改。如果您需要在状态代理中使用自己的代理处理器,[您应该在将对象*包装*在`$state`](https://svelte.dev/playground/hello-world?version=latest#H4sIAAAAAAAACpWR3WoDIRCFX2UqhWyIJL3erAulL9C7XnQLMe5ksbUqOpsfln33YuyGFNJC8UKdc2bOhw7Myk9kJXsJ0nttO9jcR5KEG9AWJDwHdzwxznbaYGTl68Do5JM_FRifuh-9X8Y9Gkq1rYx4q66cJbQUWcmqqIL2VDe2IYMEbvuOikBADi-GJDSkXG-phId0G-frye2DO2psQYDFQ0Ys8gQO350dUkEydEg82T0GOs0nsSG9g2IqgxACZueo2ZUlpdvoDC6N64qsg1QKY8T2bpZp8gpIfbCQ85Zn50Ud82HkeY83uDjspenxv3jXcSDyjPWf9L1vJf0GH666J-jLu1ery4dV257IWXBWGa0-xFDMQdTTn2ScxWKsn86ROsLwQxqrVR5QM84Ij8TKFD2-cUZSm4O2LSt30kQcvwCgCmfZnAIAAA==)之后进行包装。
请注意,如果您解构一个响应式值,引用将不会是响应式的——就像在常规 JavaScript 中一样,它们在解构点被评估:
```js
let todos = [{ done: false, text: 'add more todos' }];
// ---cut---
let { done, text } = todos[0];
// this will not affect the value of `done`
todos[0].done = !todos[0].done;
```
类
类实例不会被代理。相反,您可以在类字段(无论是公共的还是私有的)中使用 `$state`,或者在 `constructor` 内部立即将属性赋值为第一个赋值:
```js
// @errors: 7006 2554
class Todo {
done = $state(false);
constructor(text) {
this.text = $state(text);
}
reset() {
this.text = '';
this.done = false;
}
}
```
> \[注意\] 编译器将 `done` 和 `text` 转换为类原型的 `get`/`set` 方法,引用私有字段。这意味着属性不可枚举。
在调用 JavaScript 中的方法时,[`this`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this)的值很重要。这不会工作,因为`this`在`reset`方法中将是`