Я хочу обновить состояние после обновления другого состояния:
export default function App() {
const [diceNumber, setDiceNumber] = useState(0);
const [rolledValues, setRolledValues] = useState([
{ id: 1, total: 0 },
{ id: 2, total: 0 },
{ id: 3, total: 0 },
{ id: 4, total: 0 },
{ id: 5, total: 0 },
{ id: 6, total: 0 }
]);
const rollDice = async () => {
await startRolingSequence();
};
const startRolingSequence = () => {
return new Promise(resolve => {
for (let i = 0; i < 2500; i++) {
setTimeout(() => {
const num = Math.ceil(Math.random() * 6);
setDiceNumber(num);
}, (i *= 1.1));
}
setTimeout(resolve, 2600);
});
};
useEffect(()=>{
if(!diceNumber) return;
const valueIdx = rolledValues.findIndex(val => val.id === diceNumber);
const newValue = rolledValues[valueIdx];
const {total} = newValue;
newValue.total = total + 1;
setRolledValues([
...rolledValues.slice(0,valueIdx),
newValue,
...rolledValues.slice(valueIdx+1)
])
}, [diceNumber]);
return (
<div className="App">
<button onClick={rollDice}>Roll the dice</button>
<div> Dice Number: {diceNumber ? diceNumber : ''}</div>
</div>
);
}
Вот песочница.
Когда пользователь бросает кости, пара setTimeout изменяет значение состояния и в конечном итоге разрешается. Как только он разрешится, я хочу отслеживать счет в массиве объектов.
Поэтому, когда я пишу это так, он работает, но eslint выдает предупреждение об отсутствующей зависимости. Но когда я добавляю зависимость, useEffect завершается бесконечным циклом.
Как мне добиться обновления состояния после обновления состояния, не вызывая бесконечного цикла?
rolledValues
вrollDice
? - person Alexander Staroselsky   schedule 10.04.2020