46
loading...
This website collects cookies to deliver better user experience
useTimeout
and useInterval
hooks over setTimeout
and setInterval
also i will show how to create those hooks.setTimeout
or setInterval
we cannot modify either callback function or delay time. For better understanding i will explain with an example.const Alert = ({}) => {
const [message, setMessage] = useState("");
const [delay, setDelay] = useState(0);
const messageInputHandler = (e) => {
setMessage(e.target.value);
};
const dalayInputHandler = (e) => {
setDelay(e.target.value);
};
const showMessageAfterDelay = () => {
setTimeout(() => {
alert(message);
}, delay * 1000);
};
return (
<div>
Show <input onChange={messageInputHandler} type="text" /> after
<input onChange={dalayInputHandler} type="number" /> seconds
<button onClick={showMessageAfterDelay}>Done</button>
</div>
);
};
setTimeout
so we need to clear it and we need to call setTimeout
again with an updated values. Luckily we have useEffect
we can handle using it now we need to modify our code it will look like 👇🏻const Alert = ({}) => {
const [message, setMessage] = useState("");
const [delay, setDelay] = useState(0);
const messageInputHandler = (e) => {
setMessage(e.target.value);
};
const dalayInputHandler = (e) => {
setDelay(e.target.value);
};
const showMessageAfterDelay = () => {
setTimeout(() => {
alert(message);
}, delay * 1000);
};
useEffect(() => {
const idx = setTimeout(() => alert(message), delay);
return () => clearTimeout(idx);
}, [message, delay]);
return (
<div>
Show <input onChange={messageInputHandler} type="text" /> after
<input onChange={dalayInputHandler} type="number" />
seconds
<button onClick={showMessageAfterDelay}>Done</button>
</div>
);
};
useEffect
will be called automatically if message
or delay
values are updated so do we need Done
button 🤔 really. Initially we used it to trigger the setTimeout now here useEffect
is taking care of thatconst Alert = ({}) => {
const [message, setMessage] = useState("");
const [delay, setDelay] = useState(0);
const messageInputHandler = (e) => {
setMessage(e.target.value);
};
const dalayInputHandler = (e) => {
setDelay(e.target.value);
};
useEffect(() => {
const idx = setTimeout(() => alert(message), delay);
return () => clearTimeout(idx);
}, [message, delay]);
return (
<div>
Show <input onChange={messageInputHandler} type="text" /> after
<input onChange={dalayInputHandler} type="number" />
seconds
</div>
);
};
useTimeout
and can pass callback function
and delay
as arguments once any argument got updated that hook itself should update callback function
and delay
.useTimeout
hookconst useTimeout = (fn, delay) => {
const fnRef = useRef(null);
//When ever function got updated this👇🏻useEffect will update fnRef
useEffect(() => {
fnRef.current = fn;
}, [fn]);
//When ever delay got updated this👇🏻useEffect will clear current one and create a new one with updated delay value
useEffect(() => {
const idx = setTimeout(fn, delay);
return () => clearTimeout(idx);
}, [delay]);
return;
};
useInterval
as well it will be like this 👇🏻const useInterval = (fn, delay) => {
const fnRef = useRef(null);
//When ever function got updated this👇🏻useEffect will update fnRef
useEffect(() => {
fnRef.current = fn;
}, [fn]);
//When ever delay got updated this👇🏻useEffect will clear current one and create a new one with updated delay value
useEffect(() => {
const idx = setInterval(fn, delay);
return () => clearInterval(idx);
}, [delay]);
return;
};