javascript - 使用 map react setState 对象数组不起作用?

标签 javascript reactjs ecmascript-6

我在执行 setState 更改嵌套对象数组的值时遇到问题。下面的代码假设 将 id 2 的问题更改为 answer: true 但不是,怎么了?

this.state = {
  questions: [
    {
      id: 1,
      answer: ''
    },
    {
      id: 2,
      answer: ''
    },
  ]
}
//I have a click event somewhere
this.setState(
  {
    questions: this.state.questions.map(q => {
      if (q.id === 2) {
        return {
          ...q,
          answer: true
        }
      } else {
        return { ...q }
      }
    })
  },
  console.log(this.state.questions[1]) // did not see id of 2 being changed to true?
)

最佳答案

console.log(this.state.questions[1]) 行在 this.setState 行执行之前执行,这就是打印旧状态的原因到控制台。您应该将此行放在函数中以延迟执行:

this.setState(..., () => console.log(this.state.questions[1]));

此外,如果更改的状态是从当前状态派生的,建议使用函数作为第一个参数,因为 React 不会立即应用新状态,因此 this.state 可能会过时React 应用新状态:

this.setState(state => ({
  questions: state.questions.map(q => {
    if (q.id === 2) {
      return {...q, answer: true};
    }
    return q;
  })
}), () => {
  console.log(this.state.questions[1]);
});

关于javascript - 使用 map react setState 对象数组不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52435156/

相关文章:

javascript - 通过监听其他输入字段的更改事件react js计算总价

javascript - react <输入> : Dismiss soft keyboard on enter

javascript - 无法从 Promise 函数接收正确的数据

javascript - ES6 迭代器和 settimeout

javascript - 对输入值求和并在表单中选择

javascript - 如何制作随 map 缩放而增大/减小尺寸的谷歌地图标记?

javascript - 滚动到 Aos.js 时不显示元素

Javascript:如何在文本字段 data-id 属性上添加一些值

javascript - 无法将数据从 json 文件传递​​到 Chart.js 中的标签和数据集

ecmascript-6 - Istanbul如何忽略ES6的默认值分支(Babel编译为ES5)