Search with Debounce
Implement a search input with debounced API calls using useDebounce hook
HooksSearch
Live Demo
Source Code
'use client';
import { useState, useEffect } from 'react';
import { useDebounce } from '@sofondo/react';
export default function SearchPage() {
const [searchTerm, setSearchTerm] = useState('');
const [results, setResults] = useState([]);
const [loading, setLoading] = useState(false);
const debouncedSearchTerm = useDebounce(searchTerm, 500);
useEffect(() => {
if (debouncedSearchTerm) {
setLoading(true);
fetch(`/api/search?q=${debouncedSearchTerm}`)
.then(res => res.json())
.then(data => {
setResults(data);
setLoading(false);
});
} else {
setResults([]);
}
}, [debouncedSearchTerm]);
return (
<div>
<input
type="text"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
placeholder="Search..."
/>
{loading && <p>Searching...</p>}
<ul>
{results.map((result) => (
<li key={result.id}>{result.name}</li>
))}
</ul>
</div>
);
}