>假设我有这个组件,带有以下钩子:
function SomeComponent(props) {
useEffect(
() => {
//....code
if (props.propOne === ....) { .... }
// ...code
if (props.propTwo === ....) { .... }
},
[props.propOne]
)
return <Something />
}
上面的钩子将运行
- 第一次执行组件代码时
- 每次
props.propOne
的值发生变化时
但请注意,钩子回调也引用了pros.propTwo
,而实际上并没有将其传递给依赖数组。
虽然props.propTwo
永远不会考虑钩子是否被重新执行,但钩子回调在其体内引用的值会发生什么变化?
例如
- 在初始组件渲染期间
props.propOne === A
和props.propTwo === B
- 钩子被执行并引用值
A
和B
- 在后续渲染期间
props.propOne === C
和props.propTwo === D
- 钩子被重新执行,因为
props.propOne
更改了。它引用props.propOne
的值C
,但它引用props.propTwo
值的什么?B
还是D
?
钩子是否基于组件执行时创建的闭包引用值,或者 React 是否做了一些巫毒教,它只保留传递给依赖项数组的值的更新值?
从文档中:
依赖项数组不会作为参数传递给回调。不过,从概念上讲,这就是它们所代表的:回调中引用的每个值也应该出现在依赖项数组中。
更新:
在问完这个问题之后,我落到了丹·阿布拉莫夫(Dan Abramov)的这篇文章上:
https://overreacted.io/a-complete-guide-to-useeffect/
我建议大家阅读它。
>React hooks
严重依赖closures
来利用值。钩子中引用的值将是上次调用 useEffect 时闭包中存在的值。
例如,在您的示例中,如果更改了props.propOne
,并且在随后的渲染 props.propTwo 中更改了,则useEffect
回调中的props.propTwo
值将是前一个值,因为当props.propTwo
更改时不会执行 useEffect。
但是,如果您要一起更新props.propOne
和props.propTwo
,则钩子useEffect
中的值将是更新的值。
考虑到props.propOne
和props.propTwo
一起更改并触发渲染的情况,props.propTwo
的值将在回调useEffect
D