Вот способ настроить его, который сохраняет эффект использования и не имеет проблемы с зависимостью в этом эффекте: https://codesandbox.io/s/priceless-keldysh-wf8cp?file= / src / App. js
Это изменение в логи c вызова setRolledValues включает в себя избавление от случайной мутации в массиве rollValues, которая потенциально может вызвать проблемы, если вы используете его в других местах, так как все состояния React должны работать с неизменной силой, чтобы предотвратить проблемы .
setRolledValues был изменен, чтобы использовать опцию обратного вызова состояния для предотвращения требования зависимости.
useEffect(() => {
if (!diceNumber) return;
setRolledValues(rolledValues => {
const valueIdx = rolledValues.findIndex(val => val.id === diceNumber);
const value = rolledValues[valueIdx];
const { total } = value;
return [
...rolledValues.slice(0, valueIdx),
{ ...value, total: total + 1 },
...rolledValues.slice(valueIdx + 1)
];
});
}, [diceNumber]);
Я бы не рекомендовал работать с этим, хотя это имеет проблему где, если один и тот же номер прокручивается несколько раз подряд, эффект срабатывает только в первый раз.
Вместо этого вы можете переместить логи c в обратный вызов rollDice, что избавит от обеих проблем, которые были происходит. https://codesandbox.io/s/stoic-visvesvaraya-402o1?file= / src / App. js
Я добавил useCallback вокруг rollDice, чтобы он не менял ссылки, поэтому его можно использовать в useEffects.
const rollDice = useCallback(() => {
const num = Math.ceil(Math.random() * 6);
setDiceNumber(num);
setRolledValues(rolledValues => {
const valueIdx = rolledValues.findIndex(val => val.id === num);
const value = rolledValues[valueIdx];
const { total } = value;
return [
...rolledValues.slice(0, valueIdx),
// newValue,
{ ...value, total: total + 1 },
...rolledValues.slice(valueIdx + 1)
];
});
}, []);