如果redux更新了嵌套组件但是PureComponent被传递给它的父级作为道具,那么PureComponent会重新渲染吗?

时间:2017-07-10 16:22:16

标签: javascript reactjs redux

redux如果您的action / reducer更新foo.bar的值,而您的关联组件mapStateToProps(store) => { foo: store.foo },则foo={foo}然后将PureComponent传递给foo.bar个孩子。当Object发生变化时,孩子不会重新投降?这就是为什么他们建议尽可能保持平稳的东西?

感谢您的澄清。

1 个答案:

答案 0 :(得分:2)

有两个问题:

  1. 通常,PureComponent实例何时更新?
  2. 此示例中的PureComponent组件实例是否正在更新?
  3. 问题#1:PureComponentshouldComponentUpdate中的道具进行浅层比较。在this question的答案中,这意味着什么。总而言之,浅层比较检查参考的相等性而不是值的相等性。因此,如果lastProps.myObjnextProps.myObj都是对同一对象的引用,则即使truelastProps.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并确保更新不是变异。