2 回答
TA贡献1868条经验 获得超4个赞
您也许可以稍微简化该逻辑。
const diceHandler = () => {
const _dice = Math.floor(Math.random() * 6) + 1;
if (_dice !== 1) {
setCurrent(current + _dice);
setdice(_dice);
} else {
setactivePlayer(activePlayer === 0 ? 1 : 0);
setCurrent(0);
setdice(0);
}
};
请注意如何使用三元运算符来更新 activePlayer。在状态设置器中使用回调函数有时是必要的,但在这里似乎没有必要。
TA贡献1790条经验 获得超9个赞
希望下面的代码对你有帮助!
const App = () => {
const [dice, setdice] = useState(null);
const [current, setCurrent] = useState(0);
const [activePlayer, setactivePlayer] = useState(0);
const stateUpdater = _dice => {
console.log(dice);
if (dice !== 1) {
setCurrent(current + _dice);
console.log("dice value " + _dice);
} else {
console.log("Dice value is now one!", dice);
activePlayer === 0 ? setactivePlayer(1) : setactivePlayer(0);
setCurrent(0);
setdice(null);
}
};
const diceHandler = () => {
let _dice = Math.floor(Math.random() * 6) + 1;
setdice(_dice, stateUpdater(dice));
};
return (
<button className="btn-roll" onClick={diceHandler}><i className="ion-ios-loop"></i>Roll dice</button>
{dice ?
<img src={require(`./dice-${dice}.png`)} alt="Dice" className="dice" /> :
<></>
}
);
};
diceHandler 函数只负责生成 dice 的新值并将其更新到 dice 挂钩。
一旦钩子更新,就会调用回调,它的职责是在需要的地方更新值并进一步推进游戏。
它之前不能工作的原因是 setState 函数是异步的并且有延迟。这就是为什么更新变量的值可能不会立即反映在 setState 之后的语句中。
添加回答
举报