KooKs

useDebounce

입력값을 지정한 시간 동안 변경되지 않을 때만 업데이트하는 커스텀 훅
ReactTypescript

예시

실제 값: -
디바운스된 값: -
500ms 동안 입력이 없으면 값이 업데이트됩니다.

API

useDebounce<T>()
  • Parameters
    • callback ((...args: Args) => Return)디바운스할 콜백 함수
    • delay (number)실행을 지연할 시간(ms)
  • Returns
    • (...args: Args) => void (function)디바운스된 함수. 이 함수는 원본 함수와 동일한 매개변수를 받지만, delay 시간 동안 호출이 없을 때만 실행됩니다.

개발 및 사용환경

ReactTypescript

사용법

1// 기본 사용
2const [value, setValue] = useState("");
3const [debouncedValue, setDebouncedValue] = useState(value);
4
5const handleChange = useDebounce((newValue: string) => {
6  setDebouncedValue(newValue);
7}, 500);
8
9useEffect(() => {
10  handleChange(value);
11}, [value, handleChange]);
12
13// 검색 API 호출
14const handleSearch = useDebounce((searchTerm: string) => {
15  searchAPI(searchTerm);
16}, 500);
17
18// 입력 필드
19<input
20  type="text"
21  onChange={(e) => handleSearch(e.target.value)}
22/>

Hook

1import { useCallback, useRef } from "react";
2
3/**
4 * 콜백 함수를 지정한 시간 동안 호출되지 않을 때만 실행하는 Hook
5 * 
6 * 이 훅은 연속된 함수 호출을 하나로 묶어 성능을 최적화합니다.
7 * 예를 들어, 사용자 입력이나 검색 API 호출과 같이 연속적인 이벤트를 처리할 때 유용합니다.
8 *
9 * @param callback - 디바운스할 콜백 함수
10 * @param delay - 실행을 지연할 시간(ms)
11 *   - 0 이하: 경고 메시지 출력 후 즉시 실행
12 *   - 양수: 지정된 시간 동안 호출이 없을 때만 실행
13 *
14 * @returns 디바운스된 함수. 이 함수는 원본 함수와 동일한 매개변수를 받지만,
15 *         delay 시간 동안 호출이 없을 때만 실행됩니다.
16 */
17export function useDebounce<Args extends unknown[], Return>(
18  callback: (...args: Args) => Return,
19  delay: number
20): (...args: Args) => void {
21  const timeoutRef = useRef<NodeJS.Timeout | undefined>(undefined);
22
23  return useCallback(
24    (...args: Args) => {
25      if (delay <= 0) {
26        console.warn("useDebounce: delay must be a positive number");
27        callback(...args);
28        return;
29      }
30
31      if (timeoutRef.current) {
32        clearTimeout(timeoutRef.current);
33      }
34
35      timeoutRef.current = setTimeout(() => {
36        callback(...args);
37      }, delay);
38    },
39    [callback, delay]
40  );
41}