检查componentWillReceiveProps中的对象引用是否安全?

时间:2016-09-01 08:02:18

标签: javascript reactjs redux

我有一个连接到redux存储的组件,我有一个代码块,如下所示:

if (this.props.person !== nextProps.person) {
   ...
} else  {
  ...
}

...

MyComponent.propTypes {
  person: PropTypes.object.isRequired
}

以这种方式检查对象引用是否安全?我可以假设在reducer对象中引用总是会改变吗?

2 个答案:

答案 0 :(得分:2)

只要您的减速器是功能,它就是安全的。为了保证纯度,这些是减速器中你不应该做的三件最重要的事情:

  • 改变其参数(使用Object.assignobject spread operator以避免对象发生突变)
  • 执行API调用和路由转换等副作用
  • 调用非纯函数,例如Date.now()或Math.random()。

如果您的reducer满足所有3个条件,则调度的任何特定操作最终会修改状态树中的person属性,将导致新人object

在这种情况下,this.props.personnextProps.person将是两个不同的对象,并且对象引用检查将是正确的。但是,如果调度的特定操作未修改状态树中的person属性,则this.props.personnextProps.person仍将是同一个对象

答案 1 :(得分:0)

考虑一个简单的reducer:

function reducer(state, action) {
  switch(action.type) {
    ...
    default:
      return state
  }
}

这是redux的正常部分 - 如果使用未知操作调用reducer,它将返回相同的状态。在这种情况下,this.props.person === nextProps.person,因为对象引用没有改变。

如果您的代码(缩减器)更改了person的引用,则引用也会在您的组件中发生更改。