为什么在 setTimeout 回调中有信号时 Solid.js createEffect 不重新 运行?

Why does Solid.js createEffect not re-run when a signal is in a setTimeout callback?

在Solid中,为什么更新count时这个效果不会重新运行?经过一些修补,我发现它必须与 count 处于 setTimeout 回调函数中,但是了解效果中哪些内容被跟踪以及哪些内容未被跟踪的直观方法是什么?

function Counter() {
  const [count, setCount] = createSignal(0);

  createEffect(() => {
    setTimeout(() => {
      setCount(count() + 1);
    }, 1000);
  })

  return (
    <>
      {count()}
    </>
  );
}

你可以这样想(源代码差不多就是这样):

let Listener

function Counter() {
  const [count, setCount] = createSignal(0);

  createEffect(() => {
    Listener = thisEffect
    setTimeout(() => {
      setCount(count() + 1);
    }, 1000);
    Listener = null
  })

  return (
    <>
      {count()}
    </>
  );
}

如您所见,该效果将在函数启动时将自己设置为侦听器(跟踪上下文),然后重置侦听器(如果存在,则为前一个侦听器,在本例中不存在)。

因此,仅在执行您提供给 createEffect 作为参数的回调期间,效果才会是跟踪上下文。 setTimeout 会延迟执行你放入的任何东西,所以一旦你放入 setTimeout 的回调执行,效果回调就已经执行完了,这意味着它已经重置了监听器,所以效果就是不听信号了