@Ne7Le4Der

Почему state не доступен в interval?

Пытаюсь сделать таймер, код следующий
const [endTime, setEndTime] = useState<number>();
const [timerValue, setTimerValue] = useState<Time>({
        hours: 0,
        minutes: 0,
        seconds: 0
});

useEffect(() => {
        const endTimeUnix = timestamp + minutesLimit * 60;

        setEndTime(endTimeUnix * 1000);

        const timerInterval = setInterval(timer, 1000);

        return () => clearInterval(timerInterval);
}, [timestamp, minutesLimit]);


Но, в функции timer, state endTime равен undefined, как это поправить?
  • Вопрос задан
  • 104 просмотра
Пригласить эксперта
Ответы на вопрос 2
rqdkmndh
@rqdkmndh
Web-разработчик
Установка стейта происходит асинхронно. Читаем документацию
Почему setState даёт неверное значение?
Ответ написан
Комментировать
black1277
@black1277
Вольный стрелок
Добавьте лог сразу после установки нового состояния:
setEndTime(endTimeUnix * 1000);
console.log('endTime', endTime);
const timerInterval = setInterval(timer, 1000);

Вы увидите, endTime undefined. Потому что установка нового стейта не гарантирует, что это произойдет сразу, но гарантирует новое значение при следующем рендере.
Если всё же хочется что-то делать сразу после установки нового стейта - то можно переписать компонент в классовом стиле - там у this.setState вторым параметром передается callback-функция, которая выполняется после установки нового значения стейта.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы