Reactjs React-object.assign on状态未按预期工作

Reactjs React-object.assign on状态未按预期工作,reactjs,state,Reactjs,State,我想在M时刻捕获我的状态“GeoJson”的值,所以下面是我要做的: const prevGeoJson = Object.assign({}, this.state.geoJson); const geoJson = Object.assign({}, this.state.geoJson); geoJson.features.push(data); this.setState(prevState => ({ prevGeoJson: prevGeoJson, geoJson:

我想在M时刻捕获我的状态“GeoJson”的值,所以下面是我要做的:

const prevGeoJson = Object.assign({}, this.state.geoJson);
const geoJson = Object.assign({}, this.state.geoJson);
geoJson.features.push(data);

this.setState(prevState => ({
  prevGeoJson: prevGeoJson,
  geoJson: geoJson,
  currentMarker: data
}));

但是,
this.state.prevGeoJson
的值与
this.state.GeoJson
的值相同。我想这是Object.assign的正常行为,但我不明白为什么,解决方案是什么?

Object.assign只做对象的浅拷贝。这意味着
特性
数组仍在变异

请参阅此处的文档,并阅读其中显示的深度克隆警告。

有关深入克隆对象的帮助,请参见以下答案:

没有任何形式的库的最简单方法如下:

const prevGeoJson = JSON.parse(JSON.stringify(this.state.geoJson));
const geoJson = JSON.parse(JSON.stringify(this.state.geoJson));
geoJson.features.push(data);

this.setState(prevState => ({
  prevGeoJson: prevGeoJson,
  geoJson: geoJson,
  currentMarker: data
}));
这将通过将对象转换为JSON字符串,然后再将其转换回新对象来实现对象的深度复制

如果您不介意使用库,那么我建议您使用lodash的
cloneDeep
方法:


我希望这能有所帮助。

你在哪里检查?this.setState是异步的,可能不会在您预期的情况下更新。解决方案主要是依靠lifecycle hook shouldComponentUpdate和查找NextStateShey@jeremy我认为他们没有在这里进行深度复制,因为功能是相同的参考。如果你使用像lodash这样的东西,你可以尝试使用u.cloneDeep,或者将features数组展开以制作副本。我认为状态是否更新并不重要,因为我没有修改prevGeoJson状态的值。我检查render方法中的值,但是为什么prevGeoJson状态是geoJson状态的下一个值?prevGeoJson的值应该为null或具有前一个geoJson状态的值…谢谢,答案非常清楚。我添加了lodash并使用了cloneDeep,它工作得很好,从我的阅读来看,它比JSON快得多。。。