Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查componentWillReceiveProps中的对象引用是否安全?_Javascript_Reactjs_Redux - Fatal编程技术网

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

Javascript 检查componentWillReceiveProps中的对象引用是否安全?,javascript,reactjs,redux,Javascript,Reactjs,Redux,我有一个组件连接到redux store,我有一个代码块,如下所示: if (this.props.person !== nextProps.person) { ... } else { ... } ... MyComponent.propTypes { person: PropTypes.object.isRequired } 这样检查对象引用安全吗?我可以假设在一个reducer中,对象引用总是会改变吗?考虑一个简单的reducer: function reducer(

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

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

...

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

这样检查对象引用安全吗?我可以假设在一个reducer中,对象引用总是会改变吗?

考虑一个简单的reducer:

function reducer(state, action) {
  switch(action.type) {
    ...
    default:
      return state
  }
}
这是redux的正常部分-如果使用未知操作调用reducer,它将返回相同的状态。在本例中,
this.props.person===nextrops.person
,因为对象引用没有更改


如果您的代码(您的减速机)将引用更改为
person
,则组件中的引用也将更改。

考虑一个简单的减速机:

function reducer(state, action) {
  switch(action.type) {
    ...
    default:
      return state
  }
}
这是redux的正常部分-如果使用未知操作调用reducer,它将返回相同的状态。在本例中,
this.props.person===nextrops.person
,因为对象引用没有更改


如果您的代码(您的减速机)将引用更改为
person
,则组件中的引用也将更改。

只要您的减速机是纯功能,就安全了。为保证纯度,在减速器内,以下三件最重要的事情是绝对不能做的:

  • 变异其参数(使用或避免对象上的变异)
  • 执行API调用和路由转换等副作用
  • 调用非纯函数,例如Date.now()或Math.random()
如果您的reducer满足所有3个条件,则调度的用于修改状态树中的
person
属性的任何特定操作都将生成一个新的person
对象


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

只要减速器是纯功能,它是安全的。为保证纯度,在减速器内,以下三件最重要的事情是绝对不能做的:

  • 变异其参数(使用或避免对象上的变异)
  • 执行API调用和路由转换等副作用
  • 调用非纯函数,例如Date.now()或Math.random()
如果您的reducer满足所有3个条件,则调度的用于修改状态树中的
person
属性的任何特定操作都将生成一个新的person
对象

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