值变化时不会触发 Svelte 存储,仅当 $: 为前缀时
Svelte store not triggered when value chages, only when $: is prefixed
据我了解,当使用带有 $ 前缀的 Svelte 商店时,它会自动订阅值更改。
具有以下代码,每当 users.name 存储值更改时,它应该触发两个语句之一。
<script>
if (!$userS.name) {
list = Promise.reject({message:'You are not allowed to view this section!'});
} else {
list = getList('api/carousel/' + escape(term));
}
</script>
但是前面的代码工作的唯一方法是当 if 语句以“$:”为前缀时。
$: if (!$userS.name) { ...
那么,如果它已经订阅了存储值更改,为什么还需要额外的反应性美元符号?
您的组件初始化脚本,即 <script>
标记内的代码,不是 反应性的。它会在您的组件创建时运行一次,仅此而已。想想 class 构造函数。
只有反应块 $:
中的代码保持同步并在它们包含的(反应)变量发生变化时重新运行。
$
前缀为您提供商店内的 价值。在您的示例中, user
变量是商店本身。 console.log
它,您会看到它是一个具有 subscribe
方法等的对象。前缀变量为您提供商店内的值。在后台,Svelte 在创建组件时订阅商店(即调用其 subscribe
方法),并在销毁时取消订阅。
同时,如果值发生变化,$
前缀变量将是反应式的。但它只有在反应性环境中才会产生影响。也就是说,反应式 expression/statement $:
或在标记中。对于任何反应源(道具、顶级变量...)都是如此。
据我了解,当使用带有 $ 前缀的 Svelte 商店时,它会自动订阅值更改。
具有以下代码,每当 users.name 存储值更改时,它应该触发两个语句之一。
<script>
if (!$userS.name) {
list = Promise.reject({message:'You are not allowed to view this section!'});
} else {
list = getList('api/carousel/' + escape(term));
}
</script>
但是前面的代码工作的唯一方法是当 if 语句以“$:”为前缀时。
$: if (!$userS.name) { ...
那么,如果它已经订阅了存储值更改,为什么还需要额外的反应性美元符号?
您的组件初始化脚本,即 <script>
标记内的代码,不是 反应性的。它会在您的组件创建时运行一次,仅此而已。想想 class 构造函数。
只有反应块 $:
中的代码保持同步并在它们包含的(反应)变量发生变化时重新运行。
$
前缀为您提供商店内的 价值。在您的示例中, user
变量是商店本身。 console.log
它,您会看到它是一个具有 subscribe
方法等的对象。前缀变量为您提供商店内的值。在后台,Svelte 在创建组件时订阅商店(即调用其 subscribe
方法),并在销毁时取消订阅。
同时,如果值发生变化,$
前缀变量将是反应式的。但它只有在反应性环境中才会产生影响。也就是说,反应式 expression/statement $:
或在标记中。对于任何反应源(道具、顶级变量...)都是如此。