svelte
在查看库时,我在 JS 中遇到了以下有效语法:
$: doubled = 6 * 2;
起初,我认为它是特定于库的,但它适用于 Chrome 控制台。这是什么语法?
它可以是任何东西:
name: something = 6 * 2;
svelte
在查看库时,我在 JS 中遇到了以下有效语法:
$: doubled = 6 * 2;
起初,我认为它是特定于库的,但它适用于 Chrome 控制台。这是什么语法?
它可以是任何东西:
name: something = 6 * 2;
任何 JavaScript 语句(除函数声明外的种类)都可以在标签前添加:
foo: var x = 0;
你所拥有的是这样的:
$: doubled = 6 * 2;
在您的声明中,“$”是标签。
标记语句没有多大意义,因为goto
JavaScript 中没有。两者都break
可以continue
包含一个封闭循环的标签,以指示应该涉及多少“层”。
wholeLoop:
for (let i = 0; i < matrix.length; i++) {
for (let j = 0; j < matrix[i].length; j++) {
if (matrix[i][j] == null)
// Oh no! This is terrible
break wholeLoop;
}
}
以上所有内容都非常正确,但显然 Svelte 将其自己的构建时预处理器应用于组件源代码并将其转换为发送到浏览器的实际 JavaScript。标签语法的这种使用被他们“劫持”为某种含义。见昆汀的回答。
这是 JavaScript 中的标签。
这里有趣的一点是 Svelte 如何使用 this 将变量绑定到其他变量。这是 Rich Harris 解释这一点的视频的一部分。
本质上,在 Svelte 中,$:
意味着每当这些值发生变化时重新运行
如果我们看一下 Svelte 的反应式声明示例中的示例,
<script>
let count = 1;
// the `$:` means 're-run whenever these values change'
$: doubled = count * 2;
$: quadrupled = doubled * 2;
function handleClick() {
count += 1;
}
</script>
<button on:click={handleClick}>
Count: {count}
</button>
<p>{count} * 2 = {doubled}</p>
<p>{doubled} * 2 = {quadrupled}</p>
变量doubled
和quadrupled
有$
标签。因此,它们将在count
或doubled
分别更改时再次计算。
如果你看一下编译后的代码,你可以看到
let doubled, quadrupled;
$$self.$$.update = ($$dirty = { count: 1, doubled: 1 }) => {
if ($$dirty.count) { $$invalidate('doubled', doubled = count * 2); }
if ($$dirty.doubled) { $$invalidate('quadrupled', quadrupled = doubled * 2); }
};
因此,每次更新发生时,都会对这些变量进行脏检查并进行更新。
综上所述。$:
在 Svelte 中与 JavaScript 标签没有任何关系。这是 Svelte 编译器拥有更新这些变量的代码的指令。$:
当然是有效的语法,但在 Svelte 的上下文之外,它不会像在 Svelte 中那样做。神奇的是编译;)
要为已提供的答案添加更多详细信息:
Rich Harris(Svelte 的创建者)不久前写了一篇关于使用命运运算符的文章,很好地解释了这个概念(尽管当时他并没有特别建议使用$
:
https://gist.github.com/Rich-Harris/aa3dc83d3d8a4e572d9be11aedc8c238
特别是对于 Svelte.js,$:
将语句标记为“反应性”意味着它将根据后面的变量进行更新 - 正如其他人也在 javascript 中写的那样,这是一个标签,但在 svelte 中它具有特殊含义。