Javascript 在svelte中,当变量发生更改时,如何“console.log(';yes';)”?

Javascript 在svelte中,当变量发生更改时,如何“console.log(';yes';)”?,javascript,svelte,Javascript,Svelte,如果我们想在更改时打印c的值,我们可以这样写 因为c是在$指令中使用的,所以此语句可以对c作出反应 但是当c被更改时,如果我只想console.log('yes')怎么办 let c = 0; $: console.log(c); 显然,语句console.log('yes')对c没有反应 此外,如果我仍然console.log(c),但将其放入函数中: let c = 0; $: console.log('yes'); log()对c也没有反应 那么,如果反应式代码没有包含我想要反应的变量

如果我们想在更改时打印
c
的值,我们可以这样写

因为
c
是在
$
指令中使用的,所以此语句可以对
c
作出反应

但是当
c
被更改时,如果我只想
console.log('yes')
怎么办

let c = 0;
$: console.log(c);
显然,语句
console.log('yes')
c
没有反应

此外,如果我仍然
console.log(c)
,但将其放入函数中:

let c = 0;
$: console.log('yes');
log()
c
也没有反应


那么,如果反应式代码没有包含我想要反应的变量,我该怎么办?

您可以这样做:

let c = 0;
function log() {
  console.log(c);
}
$: log();

我最近一直在玩svelte,需要在属性更改时调用函数。
在Vue中,您可以使用
手表
,但在Svelte中,我找不到一个等价物。
在我的项目中,我是这样做的:

let c = 0;
$: if (c >= 0) {
    console.log("yes");
}
我不能100%确定这是不是正确的方法。

希望Rich Harris能在这里插话,因为我想知道。

我在Twitter上问过,答案是:


链接到线程:

执行此操作的最佳方法是使用一个函数,该函数可检测值何时发生更改。请看此示例

如果您只在想要执行的任何操作中使用更改变量,它也会起作用:

let c = 0;
$: if (c) {
    console.log("yes");
}

c
从1更改为0不会记录日志…但这是关于javascript中错误值的另一个线程。您的意图是将
c
逐字写在$statement中,尽管看起来很奇怪。这是一种解决方法,我们还可以编写
console.log('yes'| c)
c;console.log('yes'),但它们都很难看…我更新了我的答案,加入了
0
。如果需要的话,这个if语句也可以调整为包含负值;console.log('yes')
在推特上的@Rich\u Harris看起来并不难看,如果他回答,我会在这里同步。你可以使用较短的语法,如
$:c?console.log(是):空感谢您带着答案回来,开始这篇文章以备将来参考。我真的希望这是在苗条的文件概述。哇,这是相当的金块信息。我不会想到在
$:
之后使用逗号分隔的语句,这对我来说还是个新鲜事。这是一种有效/更好的操作方式吗?无论何时,只要你认为它在更新状态方面可能会有所不同(因为有时出于某种原因我不这样做,而有时我这样做-这仍然有点神秘)?一个大问题是,它没有暴露以前的值,因此,这将触发页面实例化以及用户触发的更新。
let c
$: if (condition) console.log(c)