redux
如果您的action
/ reducer
更新foo.bar
的值,而您的关联组件mapStateToProps
为(store) => { foo: store.foo }
,则foo={foo}
然后将PureComponent
传递给foo.bar
个孩子。当Object
发生变化时,孩子不会重新投降?这就是为什么他们建议尽可能保持平稳的东西?
感谢您的澄清。
答案 0 :(得分:2)
有两个问题:
PureComponent
实例何时更新?PureComponent
组件实例是否正在更新?问题#1:PureComponent
对shouldComponentUpdate
中的道具进行浅层比较。在this question的答案中,这意味着什么。总而言之,浅层比较检查参考的相等性而不是值的相等性。因此,如果lastProps.myObj
和nextProps.myObj
都是对同一对象的引用,则即使true
和lastProps.myObj.foo
不相等,浅层比较也会计算为nextProps.myObj.foo
。
问题2:如果您已经变异state.foo
,那么它是具有更改值的相同对象,那么浅层比较将返回假阴性。这里的复杂因素是您的示例使用Redux。你说Redux减速器已经改变了state.foo
。 Redux减速器的第一个rules之一就是它们不会改变状态或道具。他们回归新的状态。当state是一个对象时,他们会复制该对象并将更改应用于副本。如果您遵守reducer合同并更新状态而不改变它,那么您已经更改了引用。在这种情况下,PureComponent.prototype.shouldComponentUpdate
应该返回true
。
// create an object
var foo = {bar: 'bar'};
// make a copy of the object
var bar = Object.assign({}, foo);
// both objects look the same, i.e. have the same property with an equal value
foo.bar === bar.bar // -> true
// but they are not the same object so the shallow comparison evaluates to false
foo === bar // -> false
因此,如果在PureComponent
发生更改时state.foo
实例未更新,我会查看更改foo
的reducer并确保更新不是变异。