#javascript #reactjs #typescript #redux
#javascript #reactjs #typescript #redux
Вопрос:
Я пишу игру в инкрементном стиле в React, и у меня есть этот setInterval внутри App.ts:
useEffect(() => {
const loop = setInterval(() => {
if (runStatus) {
setTime(time 1);
}
}, rate);
return () => clearInterval(loop);
});
У меня также есть различные обработчики событий в соответствии с:
<button onClick={() => increment(counter 1)}>Increment</button>
К сожалению, если я нажму эту кнопку несколько раз в секунду, это заблокирует обновление time
состояния setInterval.
Это состояние с использованием перехватов, а также сохраненного состояния Redux.
Как я могу, по крайней мере, надежно установить галочку setInterval, чтобы я мог перемещаться по странице, не блокируя ее?
Комментарии:
1. попробуйте поставить
[]
в качестве своей зависимости дляuseEffect
. В противном случае каждый раз, когда ваше состояние изменяется, вы генерируете новый интервал.
Ответ №1:
Сделайте это так
[]
пустая зависимость означает выполнение только при монтировании компонента.
useEffect(() => {
const loop = setInterval(() => {
if (runStatus) {
setTime(prev => prev 1);
}
}, rate);
return () => clearInterval(loop);
}, []); <--- add that []
Примечания
- добавление времени в качестве зависимости создаст бесконечный цикл
- вам нужно добавить
runStatus
rate
переменную or в качестве зависимости, если ее динамическое состояние
Комментарии:
1. Это выполняется при каждом повторном рендеринге. Это желательно?
2. Ваш IIFE и
async
не делают здесь ничего полезного, просто[]
это все, что вам нужно..3. @Keith понял, я его удалю
4. Фантастика, это сделало это за меня. Большое спасибо @Nishargshah остальным 🙂
5. Что, если
runStatus
илиrate
изменить? Предположительно, они могут, иначе они были бы жестко запрограммированы. Они должны быть включены в массив зависимостей.