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

Is it safe to check object reference in componentWillReceiveProps?

本文关键字:是否 安全 对象引用 检查 componentWillReceiveProps      更新时间:2023-09-26

我有一个组件连接到redux存储,我有一个代码块,像这样:

if (this.props.person !== nextProps.person) {
   ...
} else  {
  ...
}
...
MyComponent.propTypes {
  person: PropTypes.object.isRequired
}

以这种方式检查对象引用是否安全?我可以假设在一个减速器对象引用将永远改变吗?

只要您的reducer是函数,它就是安全的。为了保证纯度,这是你不应该在reducer中做的最重要的3件事:

  • 改变它的参数(使用Object。赋值或对象扩展操作符,以避免对象发生突变)
  • 执行API调用和路由转换等副作用
  • 调用非纯函数,例如Date.now()或Math.random()。

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

在这种情况下,this.props.personnextProps.person将是两个不同的对象,并且对象引用检查将是正确的。然而,如果一个特定的动作没有修改状态树中的person属性,this.props.personnextProps.person仍然是相同的对象

考虑一个简单的减速器:

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

这是redux的一个正常部分-如果您的reducer被调用一个未知的操作,它返回相同的状态。在本例中是this.props.person === nextProps.person,因为对象引用没有改变。

如果您的代码(您的reducer)将引用更改为person,则该引用也将在您的组件中更改。