- 리액트에 concurrent mode 생기기 전에, 사용되던 입력 지연
- 일정 시간 동안 변화가 없을 때만 값을 반영하는 커스텀 훅
- 검색창 자동완성 같은 UI에서 너무 많은 요청 방지
- 현재는 공식훅 사용
- concurrent mode
useDeferredValue
useTransition
startTransition
suspense
-
import { useState, useEffect } from "react";
function useDebounce<T>(value: T, delay: number = 300): T {
const [debounced, setDebounced] = useState(value);
useEffect(() => {
const timer = setTimeout(() => setDebounced(value), delay);
return () => clearTimeout(timer); // 값 바뀌면 이전 타이머 취소
}, [value, delay]);
return debounced;
}
function SearchBox() {
const [query, setQuery] = useState('');
const debouncedQuery = useDebounce(query, 500);
useEffect(() => {
if (!debouncedQuery) return;
fetch(`/api/search?q=${debouncedQuery}`)
.then((res) => res.json())
.then((data) => console.log(data));
}, [debouncedQuery]);
return <input value={query} onChange={(e) => setQuery(e.target.value)} />;
}