Ответ 1
Функция возврата в useEffect
запускается каждый раз, когда запускается useEffect
(кроме первого запуска при монтировании компонента). Подумайте об этом, так как каждый раз, когда происходит новое выполнение useEffect
, старое удаляется.
Это рабочий способ использования и очистки тайм-аутов или интервалов:
export default function Loading() {
const [showLoading, setShowLoading] = useState(false)
useEffect(
() => {
let timer1 = setTimeout(() => setShowLoading(true), 1000)
// this will clear Timeout when component unmont like in willComponentUnmount
return () => {
clearTimeout(timer1)
}
},
[] //useEffect will run only one time
//if you pass a value to array, like this [data] than clearTimeout will run every time this value changes (useEffect re-run)
)
return showLoading && <div>I will be visible after ~1000ms</div>
}
Если вам нужно очистить тайм-ауты или интервалы где-то за пределами:
export default function Loading() {
const [showLoading, setShowLoading] = useState(false)
const timerToClearSomewhere = useRef(false) //now you can pass timer to another component
useEffect(
() => {
timerToClearSomewhere.current = setInterval(() => setShowLoading(true), 1000)
return () => {
clearInterval(timerToClearSomewhere.current)
}
},
[]
)
//here we can imitate clear from somewhere else place
useEffect(() => {
setTimeout(() => clearInterval(timerToClearSomewhere.current), 15000)
}, [])
return showLoading && <div>I will be visible after ~1000ms</div>
}
Если вам нужно управлять очередью (изменить состояние внутри таймера/интервала), ищите мой ответ здесь.