Я думаю, что проблема в том, что вы используете состояние для хранения локальных переменных. Вы вызываете setIter
для обновления iter
, но setIter
является асинхронным. Таким образом, он не будет обновляться немедленно, что означает, что iter
может пропускать 0 и go в отрицательные числа, которые будут бесконечными, если вы просто проверите, если iter
отличается от 0. Но, конечно, это будет работать (вроде) если вы проверите, что iter
больше 0.
Вы должны заменить свое состояние iter
на ref:
const iter = useRef(0);
Затем вы можете обновить его, используя его текущее значение:
iter.current = 10;
iter.current--;
Тогда ваш код значка будет:
icon={dice[iter.current ? Math.floor(Math.random() * 5) : val - 1]}
Аналогично, интервал ID должен храниться не в состоянии, а в ссылке:
const intervalId = useRef();