javascript - 将状态与循环 react 中的对象合并

标签 javascript reactjs

这是在 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/

相关文章:

reactjs - 将组件包装在函数、事件处理和状态 Hook 内的组合表现出意外

javascript - 如何解决错误 "Did not load script at ' 脚本名称',因为在给出 'X-Content-Type: nosniff' 时不允许使用非脚本 MIME 类型

javascript - 如何从React Form -> Flask Backend -> React Component传递数据(和CORS有关系吗)?

javascript - 使用自定义对话框时如何关闭引导箱

javascript - 将详细信息/子行添加到数据表中的某些条目

javascript - 使用material-ui中的mixins来自定义React中的组件

javascript - 能够通过 Postman 创建帐户,从 React 创建问题

javascript - React Native - 如何在 onPress 一项时隐藏数组中的其他项目?

javascript - 如何在基于 JS 的应用程序中使用 python

javascript - 使用 Framework7 和 AngularJS 加载页面