如果我不在 useEffect 数组中包含依赖项,它会在闭包内过时吗?

If I don't include a dependency in the useEffect array, will it be stale inside the closure?

示例:

const [foo, setFoo] = useState(0)
const [bar, setBar] = useState(0)

useEffect(() => { computation(foo, bar) }, [foo])

useEffect 闭包中 bar 的值会过时吗?我问是因为在我的一个应用程序中,我忘记将 bar 包含在 deps 数组中,它似乎仍然是最新的。

效果内不会过时,但bar变化时效果不会re-run。

有点,但不完全是。过时并不是真正的问题,但是 钩子 运行 是否会成为问题,因为您使用的是 useEffect 而不是 useCallback.

使用 [foo] 意味着当 foo 改变时它将 运行。如果您的其他代码设置为每当 bar 更改时,foo 已经或也将更改,那么当组件 re-renders 时,两者的新值将被看到效果挂钩。

但是如果你改bar而不改foo,效果就完全不会运行了

如果 bar 改变而 foo 没有改变,如果你使用 useCallbackuseMemo,除其他外,因为它们将值保存在外部变量中(然后可以调用或传递给其他组件)。

到这里你应该明白useEffect什么时候起作用了,

useEffect(() => { computation(foo, bar) } ) -> 将在组件中的任何状态发生变化时执行。

useEffect(() => { computation(foo, bar) }, [foo]) -> 将在安装时和 'foo' 状态更改期间执行。

useEffect(() => { computation(foo, bar) }, []) -> 只会在组件第一次挂载时执行。

因此,如果您不包含依赖项。每当组件的任何状态发生变化时,都会调用 useEffect。