reactjs - React - object.assign 状态未按预期工作
问题描述
我想在 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 只会做一个对象的浅拷贝。这意味着features
数组仍然是变异的。
请参阅此处的文档,并阅读其中的“深度克隆警告”。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
请参阅此答案以获取深度克隆对象的帮助:在 JavaScript 中深度克隆对象的最有效方法是什么?
没有任何形式的库的最简单方法是这样的:
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 字符串然后将其转换回新对象来对对象进行深层复制。
如果您不介意使用库,那么我会cloneDeep
在这里建议 lodash 的方法:https ://lodash.com/docs/4.17.10#cloneDeep
我希望这有帮助。
推荐阅读
- python - 如何映射两个数组的值并返回映射值的索引
- c++ - 自定义函数可以存储在库中并用于基本数据类型/C++ 吗?
- python - Python Twitter 情绪分析损失/准确率没有变化
- r - 在 R 中对复杂的嵌套 for 循环进行矢量化(在数据集的不同子集上运行模型,为每个循环设置不同的数据子集)
- javascript - 如何为 Ng 重复指令访问的视图中的每个项目创建查看更多切换
- java - 看不到控制台中打印的数组内容
- html - @ 媒体最大宽度无法正常工作
- python - 在 praw 中使用 mod.log
- permissions - RingCentral Meetings API 错误 - “用户需要对请求的资源拥有 [会议] 权限”
- python - 正则表达式以捕获特定百分比/小数