【问题标题】:Svelte store not triggered when value chages, only when $: is prefixed值变化时不会触发 Svelte 存储,仅在 $: 前缀时触发
【发布时间】:2020-04-30 15:27:04
【问题描述】:

据我了解,当使用带有 $ 前缀的 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) { ...

那么,如果它已经订阅了存储值更改,为什么还需要额外的反应性美元符号呢?

【问题讨论】:

    标签: store reactive svelte


    【解决方案1】:

    您的组件初始化脚本,即&lt;script&gt; 标记内的代码,是反应式的。它在创建组件时运行一次,仅此而已。想想类构造函数。

    只有反应块 $: 中的代码保持同步并在它们包含的(反应)变量发生变化时重新运行。

    $ 前缀为您提供商店内的 。在您的示例中,user 变量是商店本身。 console.log 它,您会看到它是一个具有 subscribe 方法等的对象。前缀变量为您提供存储内的值。在幕后,Svelte 在创建组件时订阅商店(即调用其subscribe 方法),并在销毁组件时取消订阅。

    同时,如果值发生变化,$ 前缀变量将是反应性的。但它只有在反应式上下文中才会产生效果。也就是说,要么是反应式表达式/语句$:,要么在标记中。对于任何响应式源(道具、顶级变量...)都是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多