Я пытаюсь реорганизовать свой код, чтобы реагировать на хуки, но я не уверен, правильно ли я это делаю.Я попытался скопировать и вставить свой код setInterval / setTimout в ловушки, но он не работал должным образом.Попробовав разные вещи, я смог заставить его работать, но я не уверен, что это лучший способ сделать это.
Я знаю, что могу использовать useEffect, чтобы очистить интервал при отмене монтирования, ноЯ хочу очистить его перед демонтажем.
Является ли следующая полезная практика, а если нет, то как лучше очистить setInterval / setTimout перед демонтажем?
Спасибо,
useTimeout
import { useState, useEffect } from 'react';
let timer = null;
const useTimeout = () => {
const [count, setCount] = useState(0);
const [timerOn, setTimerOn] = useState(false);
useEffect(() => {
if (timerOn) {
console.log("timerOn ", timerOn);
timer = setInterval(() => {
setCount((prev) => prev + 1)
}, 1000);
} else {
console.log("timerOn ", timerOn);
clearInterval(timer);
setCount(0);
}
return () => {
clearInterval(timer);
}
}, [timerOn])
return [count, setCount, setTimerOn];
}
export default useTimeout;
Компонент
import React from 'react';
import useTimeout from './useTimeout';
const UseStateExample = () => {
const [count, setCount, setTimerOn] = useTimeout()
return (
<div>
<h2>Notes:</h2>
<p>New function are created on each render</p>
<br />
<h2>count = {count}</h2>
<button onClick={() => setCount(prev => prev + 1)}>Increment</button>
<br />
<button onClick={() => setCount(prev => prev - 1)}>Decrement</button>
<br />
<button onClick={() => setTimerOn(true)}>Set Interval</button>
<br />
<button onClick={() => setTimerOn(false)}>Stop Interval</button>
<br />
</div>
);
}
export default UseStateExample;