Как я могу сделать обновление состояния асинхронным в React Redux

#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 []
 

Примечания

  1. добавление времени в качестве зависимости создаст бесконечный цикл
  2. вам нужно добавить runStatus rate переменную or в качестве зависимости, если ее динамическое состояние

Комментарии:

1. Это выполняется при каждом повторном рендеринге. Это желательно?

2. Ваш IIFE и async не делают здесь ничего полезного, просто [] это все, что вам нужно..

3. @Keith понял, я его удалю

4. Фантастика, это сделало это за меня. Большое спасибо @Nishargshah остальным 🙂

5. Что, если runStatus или rate изменить? Предположительно, они могут, иначе они были бы жестко запрограммированы. Они должны быть включены в массив зависимостей.