据我了解,当使用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) { ...
那么,如果已经订阅了商店的价值变化,为什么还需要额外的反应式美元符号呢?
你的组件初始化脚本,也就是里面的代码。<script>
标签,是 不 反应式的。当你的组件被创建时,它会运行一次,仅此而已。想想类构造函数。
只有反应块中的代码 $:
是保持同步的,并在它们所包含的(反应式)变量发生变化时重新运行。
在 $
前缀给你 价值 店内。在您的例子中, user
变量是商店本身。console.log
它,你会看到它是一个对象,有一个 subscribe
方法等。前面的变量给你在商店里面的值。在幕后,Svelte对商店进行了订阅(即调用它的 subscribe
方法),并在组件被创建时取消订阅。
同时,如果值发生变化, $
前缀的变量将是反应式的。但只有当它位于一个反应式上下文中时,它才会产生效果。也就是说,要么是一个反应式的表达式语句。$:
或在标记中。这对任何反应式源(道具、顶层变量......)都是如此。