nop*_*ole 2 svelte reactive-variable
https://svelte.dev/repl/f8db4771ba794c658d7c25a6e72d1b46?version=3.18.1中的代码
有两个“反应变量”:
$: nameUpperCase = name.toUpperCase();
$: if (name === "city") {
console.log("RUNNING HERE 01", age);
} else {
console.log("RUNNING HERE 02", age);
}
Run Code Online (Sandbox Code Playgroud)
如果值发生name变化,那么nameUpperCase也会发生变化。这个很容易。
但是对于第二部分,似乎当nameor的值age发生变化时,则对该if行进行评估。如果从age中删除console.log(),如https://svelte.dev/repl/68c2cdea2bfd462caa5ac5519fb8b99d?version=3.18.1 中所示,则age更改无关紧要。if不评估该行。
但是age从不参与为if语句生成任何最终值。它只是被打印出来,并且console.log总是 return undefined。那么规则是什么?不知何故,Svelte“神奇地”收集了 之后的所有变量$:,然后如果其中任何一个发生变化,则执行$:? 那么即使变量不参与形成某个最终值,它仍然被考虑吗?
你的问题的框架方式,我认为“是”将是一个正确的答案。
它完全按照您的描述工作:当反应块中的任何变量发生变化时,块就会被执行。
这就是规则。简单的。可预测的。看看你自己是如何正确地直觉的?
与在视图中自动反映变量的值相比,这不再是(或更少)魔法。Svelte 已经知道代码中的所有(顶级)变量。
反应块是否“产生”一个值(反应声明vs语句)是无关紧要的。这只是“所有变量”。
如果你想从观察中排除一个变量,那么从反应块中提取使用它的处理:
// runs when `name` or `age` change
$: if (name === "city") {
console.log("RUNNING HERE 01", age);
} else {
console.log("RUNNING HERE 02", age);
}
const logAge = msg => console.log(msg, age)
// only runs when `name` changes
$: if (name === "city") {
logAge("RUNNING HERE 01");
} else {
logAge("RUNNING HERE 02");
}
Run Code Online (Sandbox Code Playgroud)
你说得对。Svelte 的反应性基于分配。
API 是这样说的:
任何顶级语句(即不在块或函数内)都可以通过在其前面加上 $: 来使其响应。只要响应式语句所依赖的值发生更改,它们就会在组件更新之前立即运行。
| 归档时间: |
|
| 查看次数: |
1824 次 |
| 最近记录: |