这是在 React 和 es2015 中,我没有将导入和调用放入不同的 .js 文件,但如果你通读它,它们会互相调用。
所以我想改变一个键的状态,它的值是一个空对象。我已经尝试过并且效果很好。 现在我需要将另一个对象与状态为空的对象合并。我需要从函数中的循环调用的函数(从映射函数调用)中执行此操作。我为最后一个函数获取了正确的对象,但是当我尝试将每个键值集添加到状态中的对象时,只出现了一组,而我期望的是三组。我将尝试用一些代码来澄清。我正在努力简化代码,所以如果我遗漏了任何重要的内容,请告诉我。 (对不起,名字)
下面的所有内容都会在点击时触发
//item.js
[...]
let title = this.props.title;
someArrayWithObjs.map(function(item, key) {
checkProcess(title);
})
据我所知,这部分工作正常
//yet.js
[...]
constructor(props) {
super(props);
this.state = {vitalObj: {}}
}
checkProcess(title) {
let importantObj = {};
for (let value in needValue) {
if (needValue[value] <= presentLvl[value]) {
importantObj[title] = true;
} else {
importantObj[title] = false;
return makeRenderObj(importantObj);
};
}
return makeRenderObj(importantObj);
}
这似乎也给了我想要的结果,但接下来棘手的部分来了。我想要这样的东西:
makeRenderObj(importantObj) {
let vitalObj = this.state.vitalObj;
console.log(importantObj);
let together = React.addons.update(importantObj, {$merge: vitalObj});
console.log(together);
this.setState({vitalObj: together});
}
我在某处读到我可能正在改变状态,这就是我尝试不可变的原因。我不记得我之前尝试过什么,所以我不会与编写一个糟糕的示例相混淆。
最后两个 console.log 给了我这个输出,1.单击
{key1: correctValue} //good
{key1: correctValue} //good
{key2: correctValue} //good
{key2: correctValue} //why not key1 as well?
{key3: correctValue} // good
{key3: correctValue} //and again ??
这是第二次点击时的
{key1: correctValue} //good
{key3: correctValue, key1: correctValue} //??
{key2: correctValue} //good
{key3: correctValue, key2: correctValue} //??
{key3: correctValue} // good
{key3: correctValue} //??
所以我收到了具有正确键和正确值的正确对象,但我错误地合并了它们 - 至少我是这么认为的。
我想知道为什么会发生这种情况,以及如何重写它?
最佳答案
setState
有时是异步的(某种程度上),因此在循环中运行一堆并不会让您在每次迭代中操作最新的值。因为当您调用 this.setState 时,this.state
不会立即更新。幸运的是 setState
有另一个签名来处理这种情况。
setState((incrementalState)=> {
let vitalObj = incrementalState.vitalObj;
let together = React.addons.update(importantObj, {$merge: vitalObj});
return { vitalObj: together }
})
本质上传递一个函数意味着每个函数将被增量调用(可能稍后),但按顺序调用,以便循环的每次迭代都使用上次迭代的 sstate
关于javascript - 将状态与循环 react 中的对象合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35012957/