是的,由于对象相同,您可能会遇到未调用渲染的情况。甚至官方文档也建议不要将对象值传递给PureComponent。
仅当您希望拥有简单的道具和状态时扩展 PureComponent,或者当您知道深层数据结构已更改时使用 forceUpdate()。或者,考虑使用不可变对象来促进嵌套数据的快速比较。
但是一旦你避免改变这个在父组件中传递给props的对象,这将起作用。
如果你像 redux 的 reducers 那样做(一旦内部发生任何变化就返回新对象)你会没事的。
但同样,因为它需要任何人的额外关注,所以更安全的是避免传递对象并爆炸独立传递的原始值列表中的所有数据
[UPD] 让我们来看几个父组件代码的例子:
这里 MyPure 将始终重新渲染,因为每次传递的对象不同:
render() {
let childData = {....};
....
return (
....
<MyPure data={childData} />
这里MyPure 永远不会重新渲染,因为this.childData 表面上是相同的:
changeChild = () => {
this.childData.a++;
}
render() {
....
return (
....
<MyPure data={this.childData} />
这会很好用,因为我们只有在更新内部的东西之后才更新不同的对象:
changeChild = () => {
this.setState(oldState => ({
childData: {
...oldState.childData,
a: oldState.childData.a + 1
}
}));
}
render() {
....
return (
....
<MyPure data={this.state.childData} />
所以我们需要遵守的限制很少:
1.不要在render()中构造data prop(通过调用分离方法显式或隐式)
2. 不要改变对象数据属性