如果我不在 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
没有改变,如果你使用 useCallback
或useMemo
,除其他外,因为它们将值保存在外部变量中(然后可以调用或传递给其他组件)。
到这里你应该明白useEffect什么时候起作用了,
useEffect(() => { computation(foo, bar) } )
-> 将在组件中的任何状态发生变化时执行。
useEffect(() => { computation(foo, bar) }, [foo])
-> 将在安装时和 'foo' 状态更改期间执行。
useEffect(() => { computation(foo, bar) }, [])
-> 只会在组件第一次挂载时执行。
因此,如果您不包含依赖项。每当组件的任何状态发生变化时,都会调用 useEffect。
示例:
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
没有改变,如果你使用 useCallback
或useMemo
,除其他外,因为它们将值保存在外部变量中(然后可以调用或传递给其他组件)。
到这里你应该明白useEffect什么时候起作用了,
useEffect(() => { computation(foo, bar) } )
-> 将在组件中的任何状态发生变化时执行。
useEffect(() => { computation(foo, bar) }, [foo])
-> 将在安装时和 'foo' 状态更改期间执行。
useEffect(() => { computation(foo, bar) }, [])
-> 只会在组件第一次挂载时执行。
因此,如果您不包含依赖项。每当组件的任何状态发生变化时,都会调用 useEffect。