> Сколько значений возвращает хук useQuery (React)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: ITQ Group МКБ БАНК
Стек: React
> Пример ответа
Короткий ответ
Хук useQuery из библиотеки React Query (TanStack Query) возвращает объект с множеством полей, включая data, isLoading, error, isError, isSuccess, status, fetchStatus, refetch, isFetching и другие. Фактически это один объект, содержащий состояние запроса, данные, флаги загрузки и ошибок, а также методы для управления. Количество возвращаемых значений - около 20-25 свойств в зависимости от версии.
Подробное объяснение
useQuery возвращает единый объект, который инкапсулирует всё состояние асинхронного запроса. Основные группы полей:
- Данные и ошибки:
data,error,dataUpdatedAt,errorUpdatedAt - Флаги состояния:
isLoading,isFetching,isSuccess,isError,isIdle,isStale,isRefetching,isPaused - Статусы:
status(enum: 'loading' | 'error' | 'success' | 'idle'),fetchStatus(enum: 'fetching' | 'paused' | 'idle') - Методы:
refetch,remove,update,promise - Мета-информация:
failureCount,failureReason,errorUpdateCount,isPreviousData,isPlaceholderData
Важно понимать разницу между isLoading (первая загрузка без данных) и isFetching (любой фоновый запрос). status даёт более детальный контроль, а fetchStatus показывает, идёт ли сейчас сетевой запрос.
На практике
В реальных проектах обычно используют деструктуризацию для получения нужных полей:
JAVASCRIPTconst { data, isLoading, error } = useQuery(...)
Для сложных сценариев (пагинация, prefetching, optimistic updates) могут потребоваться isPreviousData, fetchStatus, refetch. Не стоит использовать isLoading для индикации фонового обновления - для этого есть isFetching. При работе с кэшем важно учитывать isStale для показа устаревших данных.
Пример кода
JSXimport { useQuery } from '@tanstack/react-query';function UserProfile({ userId }) {const {data,isLoading,isFetching,error,isError,status,refetch} = useQuery({queryKey: ['user', userId],queryFn: () => fetchUser(userId),staleTime: 5 * 60 * 1000, // 5 минут});if (isLoading) return <Spinner />;if (isError) return <Error message={error.message} />;return (<div>{isFetching && <RefreshIndicator />}<UserCard user={data} /><button onClick={() => refetch()}>Обновить</button></div>);}
Как отвечать на собеседовании
Начни с того, что useQuery возвращает один объект с множеством полей, а не несколько значений. Перечисли основные группы: данные, флаги состояния, методы. Подчеркни разницу между isLoading и isFetching - это частый вопрос. Упомяни, что точный список зависит от версии библиотеки (TanStack Query v3 vs v4/v5). Если спросят про кастомные хуки - скажи, что можно обернуть useQuery и вернуть только нужные поля.
Что проверяет интервьюер
- Понимание разницы между
isLoadingиisFetching - Знание структуры возвращаемого объекта, а не просто "он возвращает данные"
- Умение работать с состояниями запроса (loading, error, success)
- Понимание концепций stale time, cache time, refetching
- Способность объяснить, как использовать
statusиfetchStatusдля точного контроля
Типичные ошибки
- Путают
isLoadingиisFetching, используя первый для всех индикаций загрузки - Думают, что
useQueryвозвращает несколько значений (как массив), а не объект - Игнорируют
statusиfetchStatus, хотя они дают более гибкий контроль - Не учитывают, что
dataможет бытьundefinedприisLoading === false(если ошибка) - Забывают про
isPreviousDataпри пагинации, что приводит к миганию интерфейса
> Похожие задачи по frontend
Какие хуки существуют кроме useState и useEffect
Как обработать ответ API в React
Как работать с loading и data из useQuery
Как называется алгоритм сравнения деревьев в React
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью