Reactjs React PureComponent和shouldComponentUpdate

Reactjs React PureComponent和shouldComponentUpdate,reactjs,lifecycle,Reactjs,Lifecycle,我知道PureComponent,但经过深思熟虑,我对它感到困惑 ShouldComponentUpdate函数在状态或道具更改时调用。因此,我们肯定知道,如果调用ShouldComponentUpdate,状态或道具中的某些内容会发生更改。这些变化也应该反映在组件视图中。如果状态或道具未更改,则永远不会调用shouldComponentUpdate PureComponent提供旧状态或道具与新状态或道具之间的粗略比较,如果它们相同,则不会渲染。但是我们已经知道,shouldComponent

我知道PureComponent,但经过深思熟虑,我对它感到困惑

ShouldComponentUpdate
函数在状态或道具更改时调用。因此,我们肯定知道,如果调用
ShouldComponentUpdate
,状态或道具中的某些内容会发生更改。这些变化也应该反映在组件视图中。如果状态或道具未更改,则永远不会调用
shouldComponentUpdate

PureComponent
提供旧状态或道具与新状态或道具之间的粗略比较,如果它们相同,则不会渲染。但是我们已经知道,
shouldComponentUpdate
被调用的事实意味着新状态或道具与旧状态或道具不同


从逻辑上讲,我对此感到困惑,所以我不得不发布这个问题。您能给我一些建议吗?

注意:这是我的理解,因此其他人请随时评论任何问题/更正

你在问题中做了一个错误的假设。您认为对于普通的
React.Component
组件,如果状态/道具中没有任何更改,则永远不会调用
shoulldcomponentupdate
,也不会重新渲染。事实并非如此,例如,如果普通组件的父级重新渲染,并且父级将道具传递给子级,子级也将重新渲染。即使它传递的那些道具值实际上是相同的(您可以通过在孩子的
render()
函数中放置
console.log
来测试这一点)。但是,即使子级将重新渲染,实际上不会有任何更改(就DOM而言),因为道具是相同的。因此,从技术上讲,它进行了不必要的重新渲染

在普通组件中,
shouldComponentUpdate
始终返回true(假设您没有明确定义它)。因此,如果道具/状态相同,它将始终重新渲染,只是如果没有任何相关差异,DOM将不会以任何方式更改。然而,在
PureComponent
中,它实际上会对新的状态/道具进行粗略的比较,并且只有在它们发生更改时才会触发重新渲染。其思想是为您实现一个
shouldComponentUpdate
方法


对于不想经常更改的组件,进行这种肤浅的比较(相对快速且便宜)比不考虑任何更改而不断地重新渲染要好。总之,纯组件通过在重新渲染之前对状态/道具进行比较,并确保它们实际上不同,从而防止不必要的重新渲染。

这可能会有所帮助。是的,我知道。。使用immutable而不是变异当前对象进行更改检测。但从逻辑上讲,我并不完全理解。。shouldcomponentupdate调用已经意味着状态或道具已更改..shouldcomponentupdate在pure component或component中调用?在pure component中PureComponent本身具有shouldcomponentupdate函数,但在您确实不想更新组件的情况下,它也会调用组件的函数。这就是为什么它会被调用。非常感谢你的善意解释。“这不是真的,例如,如果普通组件的父级重新渲染,并且父级将道具传递给子级,子级也将重新渲染。”其中一种情况可能是父级的状态已更改并重新渲染,但子级的道具未更改,因此无需重新渲染。我现在有点明白了。我想我也可以对多个孩子做更多的实验。非常感谢你的帮助!!