javascript - 为什么 React 状态没有正确更新?

标签 javascript reactjs react-hooks state javascript-objects

我正在制作一个数学游戏,我希望在回答一定数量的问题后更新操作数的范围。我有这段代码来设置难度

  const [difficulty, setDiff] = useState({rangeA:[1, 10], rangeB:[1, 10]});
  
  function setDifficulty(op) {
    let rangeA = [];
    let rangeB = [];
    if (question < 5) { //question state is incremented everytime the answer is correct, which triggers the next question
      rangeA = [0, 100];
      rangeB = [0, 10];
    }
    else if (question < 8) {
      rangeA = [0, 100];
      rangeB = [0, 100];
    }
    setDiff({...difficulty, rangeA, rangeB});
    console.log(rangeB, difficulty.rangeB); // when question is 5, this logs [0, 100] [0, 10], but they should be the same value [0,100]
  }

但是状态没有正确更新,可能会发生什么?

最佳答案

在 React 中设置状态就像一个异步函数。
这意味着当您设置状态并在其后面放置 console.log 时,它可能会在状态实际完成更新之前运行。

这就是为什么我们有 useEffect,这是一个内置的 React 钩子(Hook),当它的依赖项之一发生更改时,它会激活回调。

示例:

useEffect(() => {
   console.log(difficulty)
   // Whatever else we want to do after the state has been updated.
}, [difficulty])

console.log 仅在状态完成更改并发生渲染后运行。

  • 注意:示例中的“难度”可以与您正在处理的任何其他状态部分互换。

检查documentation了解更多信息。

关于javascript - 为什么 React 状态没有正确更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73074964/

相关文章:

javascript - 如何使用 React Hooks 捕获最后一个输入字母

javascript - useEffect 钩子(Hook)在方向改变时不触发

高于 U+FFFF 的字符的 Javascript 文字

javascript - 在 JavaScript 中对列表列表进行排序

javascript - 使用 {...state} 创建仅修改一个字段的对象的新实例在 React JS 中不起作用

javascript - 简单的 Web 开发概念我找不到关于 +update 的任何信息

javascript - ES6 替代 async.seq 流程控制

javascript - Angular6 - 'json' 在类型 'Object' 上不存在

javascript - 使用 URL react 路由器打开页面

reactjs - 如何通过 useEffect 立即使用来自 API 的数据?