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

Nic*_*ick 7 solid-js

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

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

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

  return (
    <>
      {count()}
    </>
  );
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*ick 7

你可以这样想(这几乎就是源代码的工作原理):

let Listener

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

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

  return (
    <>
      {count()}
    </>
  );
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,当函数启动时,效果会将自身设置为侦听器(跟踪上下文),然后重置侦听器(如果存在,则重置为前一个侦听器,在本例中它不存在)。

createEffect因此,仅在执行您作为参数提供的回调期间,效果才会是跟踪上下文。setTimeout延迟执行您放入其中的任何内容,因此一旦您放入的回调setTimeout执行,效果回调将已经执行完毕,这意味着它已经重置了侦听器,因此效果不再侦听信号。