#reactjs #react-hooks #use-effect #react-functional-component #cleartimeout
Вопрос:
У меня есть вопрос об использовании setTimeout, clearTimeout на крючке React useEffect.
useEffect(() => {
let timer = setTimeout(() => {
setRemainingSecond(remainingSecond - 1);
}, 1000);
return (() => {
clearTimeout(timer);
});
}, [remainingSecond]);
Это мой код реакции с компонентом обратного отсчета.
Я понимаю, почему я должен очищать идентификатор времени каждый раз, когда компонент отключается из-за утечки памяти и других проблем с синхронизацией.
Но clearTimeout
предназначен ли он для отмены setTimeout
функции обратного вызова, верно?
и поскольку useEffect
функция обратного вызова будет вызвана до монтирования компонента, не должна ли функция обратного вызова по таймауту быть отменена, и ничего не произойдет?
Комментарии:
1.
and since useeffect return callback function will be called before component mounts
откуда это взялось?2. разве функция обратного вызова таймаута не должна быть отменена, и ничего не произойдет? Я не понял этой части
3. Если компонент повторно отрисовывает/размонтирует до истечения срока действия таймера, не очистка установленного таймера приведет к выполнению функции обратного вызова предыдущего таймера, что вам не нужно.
Ответ №1:
useEffect
обратный вызов будет выполняться каждый раз при изменении массива зависимостей ИЛИ перед компонентом unmounts
(НЕТ mounts
).
В этом случае ваш таймер будет продолжать уменьшаться на 1 секунду каждую секунду, но если ваш компонент по какой-либо причине отключен, он не будет пытаться вызвать setRemainingSecond
, как только 1000
ms закончится, предотвращая печально известную ошибку:
Можно обновить только установленный или монтируемый компонент. Обычно это означает, что вы вызвали setState() для размонтированного компонента. Это не операция. Пожалуйста, проверьте код на наличие неопределенного компонента.