2. useTimeout()
Create a hook to easily use setTimeout(callback, delay).
- reset the timer if delay changes
 - DO NOT reset the timer if only callback changes
 
answer: this question has two points
- when delay is changed, setTimeout should be changed
 - when callback is changed, setTimeout should not be changed, but callback should be updated You can see my github file src/views/react/Timeout.jsx (opens in a new tab)
 
import { useEffect, useRef, useState } from "react";
 
function useTimeout(callback, deley) {
  const callbackRef = useRef(callback);
  callbackRef.current = callback;
  useEffect(() => {
    // callbackRef.current is to keep callback up to date
		// When to use refs: https://react.dev/learn/referencing-values-with-refs#when-to-use-refs
    const handler = setTimeout(() => callbackRef.current(), deley);
    return () => {
      clearTimeout(handler);
    };
  }, [deley]);
 
  return callbackRef.current;
}
 
// test
export default function Timeout() {
	const [value, setValue] = useState(0);
 
  useEffect(() => {
    setValue(8);
  }, []);
 
  useTimeout(() => {
    // if callbackRef.current is callback,log data is 0
    console.log(value);
  }, 1000);
  useTimeout(() => {
    console.log(2);
  }, 1000);
  useTimeout(() => {
    console.log(3);
  }, 100);
  useTimeout(() => {
    // log 3 8 2 4
    console.log(4);
  }, 2000);
 
  return (
    <div className="App">
      <p>Value: {value}</p>
      <button onClick={() => setValue(value + 1)}>Click Me</button>
    </div>
  );
}