react
useDebounce Hook
React hook to debounce rapidly changing values, perfect for search inputs and API calls.
#hooks
#performance
#optimization
Debounce values to reduce unnecessary renders and API calls.
useDebounce (Value)
Debounces any value:
import { useState, useEffect } from 'react';
function useDebounce<T>(value: T, delay: number = 500): T {
const [debouncedValue, setDebouncedValue] = useState<T>(value);
useEffect(() => {
const timer = setTimeout(() => setDebouncedValue(value), delay);
return () => clearTimeout(timer);
}, [value, delay]);
return debouncedValue;
}
export default useDebounce;
Usage - Search Input
function SearchComponent() {
const [query, setQuery] = useState('');
const debouncedQuery = useDebounce(query, 300);
useEffect(() => {
if (debouncedQuery) {
// Only fires 300ms after user stops typing
searchAPI(debouncedQuery);
}
}, [debouncedQuery]);
return (
<input
value={query}
onChange={e => setQuery(e.target.value)}
placeholder="Search..."
/>
);
}
useDebouncedCallback (Function)
For debouncing callbacks:
import { useCallback, useRef } from 'react';
function useDebouncedCallback<T extends (...args: any[]) => void>(
callback: T,
delay: number
): T {
const timeoutRef = useRef<NodeJS.Timeout>();
return useCallback(
((...args) => {
if (timeoutRef.current) clearTimeout(timeoutRef.current);
timeoutRef.current = setTimeout(() => callback(...args), delay);
}) as T,
[callback, delay]
);
}
Usage - Debounced Callback
function AutoSave() {
const [content, setContent] = useState('');
const debouncedSave = useDebouncedCallback((text: string) => {
saveToServer(text);
}, 1000);
const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
const newContent = e.target.value;
setContent(newContent);
debouncedSave(newContent); // Auto-saves 1s after last keystroke
};
return <textarea value={content} onChange={handleChange} />;
}
When to use:
- Search inputs
- Window resize handlers
- Auto-save functionality
- Form validation