> Как реализовать React компонент с текстовым полем для запроса к API, отображением результатов, индикатором загрузки и обработкой ошибок? (React)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Т-Банк, IT-One, Сбер
Стек: React
> Пример ответа
Вот пример реализации компонента поиска с API, загрузкой и обработкой ошибок на React с использованием хуков:
JSXimport React, { useState, useEffect, useCallback } from 'react';const SearchComponent = () => {const [query, setQuery] = useState('');const [results, setResults] = useState([]);const [loading, setLoading] = useState(false);const [error, setError] = useState(null);// Функция запроса к APIconst fetchResults = useCallback(async (searchQuery) => {if (!searchQuery.trim()) {setResults([]);return;}setLoading(true);setError(null);try {const response = await fetch(`https://api.example.com/search?q=${searchQuery}`);if (!response.ok) {throw new Error(`Ошибка HTTP: ${response.status}`);}const data = await response.json();setResults(data);} catch (err) {setError(err.message || 'Произошла ошибка при запросе');setResults([]);} finally {setLoading(false);}}, []);// Дебаунс для предотвращения частых запросовuseEffect(() => {const timer = setTimeout(() => {fetchResults(query);}, 300);return () => clearTimeout(timer);}, [query, fetchResults]);const handleChange = (e) => {setQuery(e.target.value);};return (<div><inputtype="text"value={query}onChange={handleChange}placeholder="Введите запрос..."/>{loading && <div>Загрузка...</div>}{error && <div style={{ color: 'red' }}>Ошибка: {error}</div>}{!loading && !error && results.length > 0 && (<ul>{results.map((item, index) => (<li key={index}>{item.name || item.title}</li>))}</ul>)}{!loading && !error && query && results.length === 0 && (<div>Результаты не найдены</div>)}</div>);};export default SearchComponent;
Ключевые моменты реализации:
- Использование
useStateдля управления состоянием (запрос, результаты, загрузка, ошибка) useCallbackдля мемоизации функции запросаuseEffectс дебаунсом (300 мс) для оптимизации количества запросов- Обработка ошибок через try/catch с отображением сообщения пользователю
- Индикатор загрузки (
loading) и пустое состояние при отсутствии результатов - Очистка таймера при размонтировании компонента или изменении запроса
> Похожие задачи по frontend
Будет ли работать React.memo если пропсы передаются в виде объекта, который меняется по ссылке
Уровень: seniorКатегория: Технические вопросы
Компания: Иннотех
Стек: React
Почему React работает быстро, как устроен виртуальный DOM и процесс обновления?
Уровень: middleКатегория: Технические вопросы
Компания: Исходный Код
Стек: React
В чем отличие useEffect от useLayoutEffect в React
Уровень: seniorКатегория: Технические вопросы
Компания: Точка, Soft_Media_Group, EvApps, VK, Aston, IT-One, Софт Медиа Групп, EPAM, ПСБ, intelsy, Black Wall Group (BWG), Сбер
Стек: React
Как работает жизненный цикл React-компонентов
Уровень: seniorКатегория: Технические вопросы
Компания: Инрэко, Точка, Kvando Technologies, ООО Премиум ИТ Солюшен, Kodix, Spotware, Aston, IT-One, EPAM, Сбер, SmartWay
Стек: React
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью