Svelte存储在值改变时不被触发,只有当$:为前缀时才会触发。

问题描述 投票:0回答:1

据我了解,当使用Svelte store时,前缀为$,它会自动订阅值变化。

有了下面的代码,每当user.name store的值发生变化时,就应该触发这两条语句中的一条。

 <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个回答
1
投票

你的组件初始化脚本,也就是里面的代码。<script> 标签,是 反应式的。当你的组件被创建时,它会运行一次,仅此而已。想想类构造函数。

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

$ 前缀给你 价值 店内。在您的例子中, user 变量是商店本身。console.log 它,你会看到它是一个对象,有一个 subscribe 方法等。前面的变量给你在商店里面的值。在幕后,Svelte对商店进行了订阅(即调用它的 subscribe 方法),并在组件被创建时取消订阅。

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

© www.soinside.com 2019 - 2024. All rights reserved.