Проверяет умение реализовать поиск с запросом к API при изменении текста и фильтра, включая debounce, отмену устаревших запросов и обработку состояний загрузки и ошибок.
Поиск с запросом к API при вводе текста и смене фильтра — классическая задача фронтенда. Главная сложность не в самом запросе, а в управлении асинхронностью: пользователь печатает быстро, фильтры меняются, и без контроля легко получить гонку ответов, когда старый запрос приходит позже нового и перезаписывает актуальные данные.
function Search() {
const [query, setQuery] = useState('');
const [filter, setFilter] = useState('all');
const [data, setData] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
useEffect(() => {
const controller = new AbortController();
const timer = setTimeout(async () => {
setLoading(true);
setError(null);
try {
const res = await fetch(
`/api/search?q=${query}&filter=${filter}`,
{ signal: controller.signal }
);
if (!res.ok) throw new Error('Request failed');
setData(await res.json());
} catch (e) {
if (e.name !== 'AbortError') setError(e.message);
} finally {
setLoading(false);
}
}, 300);
return () => {
clearTimeout(timer);
controller.abort();
};
}, [query, filter]);
return (
<div>
<input value={query} onChange={e => setQuery(e.target.value)} />
<select value={filter} onChange={e => setFilter(e.target.value)}>
<option value="all">All</option>
<option value="active">Active</option>
</select>
{loading && <p>Loading...</p>}
{error && <p>Error: {error}</p>}
<ul>{data.map(item => <li key={item.id}>{item.name}</li>)}</ul>
</div>
);
}Функция очистки в useEffect вызывается перед следующим запуском эффекта. Она сбрасывает таймер debounce и отменяет текущий запрос. Это гарантирует, что в состоянии окажется только ответ на последний актуальный запрос. Флаг loading сбрасывается в finally, поэтому индикатор не залипнет даже при ошибке.
Такой подход стоит применять в любом интерфейсе с живым поиском, фильтрацией каталогов или автодополнением, где важны отзывчивость и корректность данных.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию