KooKs

useTimeout

지정한 시간 후에 콜백 함수를 실행하는 커스텀 훅
ReactTypescript

예시

0초
타이머가 종료되면 alert이 실행됩니다!

API

useTimeout()
  • Parameters
    • callback (Function)실행할 콜백 함수
    • delay (number)콜백 실행 전 대기 시간(ms). 음수인 경우 타이머가 시작되지 않습니다.
  • Returns
    • start (Function)타이머를 시작하는 함수
    • clear (Function)타이머를 취소하는 함수
    • reset (Function)타이머를 재시작하는 함수
    • isPending (boolean)타이머가 실행 중인지 여부

개발 및 사용환경

ReactTypescript

사용법

1// 기본 사용
2const { start, clear, reset, isPending } = useTimeout(() => {
3  console.log("3초 후 실행");
4}, 3000);
5
6// 타이머 시작
7start();
8
9// 타이머 취소
10clear();
11
12// 타이머 재시작
13reset();
14
15// 상태 확인
16console.log(isPending); // 타이머 실행 중 여부

Hook

1import { useCallback, useEffect, useRef, useState } from "react";
2
3/**
4 * 지정된 시간(delay) 후에 콜백 함수를 실행하는 React 훅
5 * 
6 * @param callback - delay 시간 후에 실행될 콜백 함수
7 * @param delay - 콜백 함수 실행 전 대기 시간 (밀리초). 음수인 경우 타이머가 시작되지 않음
8 * @returns {Object} 타이머 제어를 위한 메서드와 상태
9 * @property {Function} start - 타이머 시작
10 * @property {Function} clear - 타이머 취소
11 * @property {Function} reset - 타이머 재시작
12 * @property {boolean} isPending - 타이머가 실행 중인지 여부
13 */
14export function useTimeout(callback: () => void, delay: number) {
15  const timeoutRef = useRef<NodeJS.Timeout | null>(null);
16  const savedCallback = useRef(callback);
17  const [isPending, setIsPending] = useState(false);
18
19  useEffect(() => {
20    savedCallback.current = callback;
21  }, [callback]);
22
23  const clear = useCallback(() => {
24    if (timeoutRef.current) {
25      clearTimeout(timeoutRef.current);
26      timeoutRef.current = null;
27    }
28    setIsPending(false);
29  }, []);
30
31  const start = useCallback(() => {
32    if (delay < 0) {
33      return;
34    }
35    
36    clear();
37    setIsPending(true);
38
39    timeoutRef.current = setTimeout(() => {
40      savedCallback.current();
41      timeoutRef.current = null;
42      setIsPending(false);
43    }, delay);
44  }, [delay, clear]);
45
46  const reset = useCallback(() => {
47    start();
48  }, [start]);
49
50  useEffect(() => clear, [clear]);
51
52  return { start, clear, reset, isPending };
53}