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 之后的語句中。
添加回答
舉報