reactjs - React Beginner - React 组件在状态更新后无法正确重新渲染
问题描述
我是 React 初学者,我正在尝试在浏览器中创建一个小游戏,其中显示一组数字,用户必须从多项选择中正确选择所有数字的总和。我有一个通过 onClick 回调启动游戏的按钮,如下所示。
const [sequence, setSequence] = useState([]);
const [sum, setSum] = useState(0)
const [countdown, setCountdown] = useState(10);
const [multipleChoice, setMultipleChoice] = useState([]);
const createSequence = () => {
let newSequence = []
for (let i = 0; i < 6; i++) {
newSequence.push(Math.floor(Math.random() * 9) + 1);
}
setSequence(newSequence);
}
const createRandomAnswers = () => {
let multipleChoiceArray = someRandomArrayFunction();
setMultipleChoice(multipleChoiceArray);
}
const calculateSum = () => {
// calculates sum of current number sequence and updates sum state
let total = 0;
for (var i in sequence) {
total += sequence[i];
}
setSum(total);
}
const createGame = () => {
createSequence();
console.log("calculating sum")
calculateSum();
createRandomAnswers();
}
return (
<>
<p> {sum}</p>
<h2>{sequence}</h2>
<button onClick={createGame}>Start Game</button>
<Choice value={multipleChoice[0]} />
<Choice value={multipleChoice[1]} />
<Choice value={multipleChoice[2]} />
</>
);
这三个函数都使用状态钩子更新状态变量。但是,每个正确值都不同步。
例如,如果我有一个数组序列 [1, 2, 3, 4],总和应该显示为 10。当调用 createGame 时,序列会更新,但直到第二次调用 createGame 时,总和才会更新,此时序列更新为一个新数字,并且总和设置为 10。
createGame();
// Sequence displayed as [1, 2, 3, 4]
// sum displayed as 0 (initial state)
// multiple choice displayed as blank (initial state)
createGame();
// Sequence updates to random, e.g. [3, 1, 3, 2]
// sum displayed as 10 (sum from previous sequence)
// multiple choice displayed as blank (initial state)
当它们都在 createGame 中被调用时,为什么这些值会滞后并一次更新?我知道我可能误解了一些核心 React 原则,但我们将不胜感激。
解决方案
推荐阅读
- typescript - 从抽象类中获取属性的智能感知
- c# - 通过 c# 和 php 更新用户状态
- html - 在web2py中SQLFORM的自定义html表单中,如何将url的请求参数复制到表单字段输入中?
- javascript - 如果只有一个线程可用,异步/等待有什么好处?
- node.js - Node.js 使用 XMLHttpRequest POST 404 错误
- css - 即使我不包括在内,也会应用 Google 字体粗细
- reactjs - 在 Heroku 上部署时,图像未在 React 应用程序中加载
- objective-c - 如果没有返回语句的 Obj-C 方法包含 @try @catch 块,则它会编译
- c++ - 在查找大输入的数字总和时出错?
- android - 离子构建 --verbose android 错误 ts2740