正在阅读 svelte
教程,其中提到 $:
这是 JavaScript 中的常规,但不明白。
let count = 0;
$: doubled = count * 2;
你会如何在原版 JavaScript 中做到这一点。检查已更改的代码
回答1
我假设您的意思是这个文档 - https://svelte.dev/docs#component-format-script-3-$-marks-a-statement-as-reactive
在这种情况下,我认为他们正在谈论称为“标签”的编程语言语法功能。如果是 JS,您可以在这里阅读:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label
需要仔细查看Svelte源代码,但我猜他们使用这种有效的JS语法模式$:
来标记顶级语句并允许它们稍后解析和预处理。
所以这不是一个黑色的 JS 魔法,而是一个只在 Svelte “世界”中的约定。
更新:
我认为它在源代码中的某处使用 - https://github.com/sveltejs/svelte/blob/0d017f482016caa51d34918f79dc0b83f0428fd7/src/compiler/compile/Component.ts#L651
如果您想遵循逻辑,请查看“LabeledStatement”的用法。
回答2
你会如何在原版 JavaScript 中做到这一点。检查已更改的代码
对此有多种方法。例如。通过比较以前的 values 和当前的 values 来进行脏检查,从而确定更改。这种方法有一些缺点。其中,由于所有必要的比较,数据可能会重复,并且对于大量数据,性能可能会降低。
另一种方法是使依赖项显式化,并且仅在其中一个依赖项更改时更新。 Svelte 自动生成所需的代码,但也可以手动完成。如果您查看生成的代码,您会发现变量被标记为无效,这会触发对因变量的更新。
例如。在增加计数变量的单击处理程序中,您将获得:
const click_handler = () => $$invalidate(0, count++, count);
对于响应式语句,代码仅在 count
已更改时运行:
$$self.$$.update = () => {
if ($$self.$$.dirty & /*count*/ 1) {
$: doubled = count * 2;
}
};
不过,此代码针对性能进行了优化。它使用数组索引来实现更快的数据访问和更精简的代码。对于旨在由人类编写和阅读的代码,您可能不想这样做。一般来说,我不建议以任何方式手动执行此操作;它更冗长,您必须确保始终正确指定依赖项才能使其正常工作。
回答3
$:
是特殊的 Svelte 语法,在原版 javascript 中不起作用。
该语法与普通的 javascript 兼容(它是一个 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label),因此像 javascript 解析器和荧光笔这样的工具不会中断。
但是原版 javascript 没有内置任何反应性,因此它的行为非常不同。
(它忽略了 $:
)
在 vanilla 中无法监听原始变量的变化。
https://www.google.com/search?q=state+management+javascript。