Javascript 无法检测连接到ComponentDidUpdate中Redux存储的道具中的更改

Javascript 无法检测连接到ComponentDidUpdate中Redux存储的道具中的更改,javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,出于某种原因,我无法检测ComponentDidUpdate()中道具的更改 父组件: class Parent extends Component{ componentDidUpdate(prevProps,prevState){ // here, prevProps is the same as this.props even though the // consultations object is changed by the date component }

出于某种原因,我无法检测ComponentDidUpdate()中道具的更改

父组件:

class Parent extends Component{

  componentDidUpdate(prevProps,prevState){
    // here, prevProps is the same as this.props even though the 
    // consultations object is changed by the date component
  }

  render(){
    return(
      <p>{this.props.consultation.date}</p> /* Changes when date 
      component changes the date. This works! */
      <DateComponent />
    );
  }
}
function mapStateToProps({consultation}){
  return {consultation}
}

export default connect(mapStateToProps, null)(Parent)

现在,您正在将一些属性从state复制到consultation中,并以如下状态结束:

{
  ...state,
  consultation : {
    ...state,
    date: action.data.date
  }
}
我怀疑那是你想要的。我猜你是有意的:

选择(1):

{
  ...state,
  date: action.data.date
}
{
  ...state,
  consultation : {
    date: action.data.date
  }
}
或者你的意思是咨询是国家的财产,比如:

var consultations_copy = {...state.consultations}
选择(2):

{
  ...state,
  date: action.data.date
}
{
  ...state,
  consultation : {
    date: action.data.date
  }
}
您选择上面的选项(1)还是选项(2)取决于您的数据模型

要实现选择(1):

或实现选择(2):


这个问题与对象的深度复制有关

我的咨询对象有这样一种结构:

consultations = {
 3322345: {id:123,date:10/10/2018},
 1234567: {id:456,date:10/10/2018}
}
我的错误是,在减速器中,我会首先复制当前状态,如下所示:

var consultations_copy = {...state.consultations}
这是一个大错误!因为这不做对象的深度复制,并且仍然引用原始对象

因此,当我做出类似于[1234567].date=“12/12/2018”的更改时,我实际上是在更改原始对象

进行深度复制的最佳方法是:

var consultations_copy = JSON.parse(JSON.stringify(state.consultations));

这听上去肯定像是在修改咨询时会发生的行为。你能发布reducer代码吗?我已经把它添加到我的问题中了。我觉得没问题。你看到什么了吗?我将prevProps和prevState与this.props和this.state进行了比较。这表明他们是平等的!这怎么可能?那么为什么还要调用ComponentDidUpdate呢?我快疯了!感谢TLadd的帮助。问题是关于改变原始对象。我已经发布了解决方案。谢谢你为我指明了正确的方向@TLadd。谢谢你!