值变化时不会触发 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 $: 或在标记中。对于任何反应源(道具、顶级变量...)都是如此。