> Работали ли вы с React Query? (React)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Яндекс
Стек: React
> Пример ответа
Короткий ответ
Да, работал с React Query (TanStack Query) в нескольких коммерческих проектах. Использовал для управления серверным состоянием, кэширования данных, автоматической перезагрузки (refetching) и оптимистичных обновлений. React Query значительно упрощает синхронизацию UI с сервером, избавляя от ручного управления loading/error состояниями и reduce-логики в Redux или Context.
Подробное объяснение
React Query - это библиотека для управления асинхронным состоянием, которая решает проблему синхронизации данных между сервером и клиентом. Основные концепции: queries (запросы на чтение), mutations (запросы на запись), кэширование с автоматической инвалидацией, stale time, retry, prefetching и оптимистичные обновления. В отличие от Redux или MobX, React Query не требует написания boilerplate для каждого API-вызова - достаточно определить query key и функцию-запрос. Библиотека автоматически управляет состоянием (loading, error, success), deduplicates запросы, поддерживает параллельные и зависимые запросы, а также пагинацию и infinite scroll. Для senior-разработчика важно понимать trade-offs: React Query не заменяет глобальное состояние (например, для UI-состояния), но идеально подходит для серверных данных.
На практике
В реальных проектах React Query используется для:
- Кэширования данных с настраиваемым staleTime (например, 5 минут для списка товаров, 30 секунд для курса валют).
- Автоматической перезагрузки при фокусе окна (refetchOnWindowFocus) для актуальности данных.
- Оптимистичных обновлений - мгновенное обновление UI до ответа сервера с откатом при ошибке.
- Infinite queries для ленивой подгрузки списков (например, лента новостей).
- Зависимых запросов, когда один запрос использует данные другого (например, получить профиль пользователя, затем его заказы).
- Мутаций с автоматической инвалидацией связанных query (например, после создания заказа сбросить кэш списка заказов).
Пример кода
TSXimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';import { fetchUser, updateUser } from './api';// Queryfunction UserProfile({ userId }: { userId: string }) {const { data, isLoading, error } = useQuery({queryKey: ['user', userId],queryFn: () => fetchUser(userId),staleTime: 5 * 60 * 1000, // 5 минутretry: 2,});if (isLoading) return <Spinner />;if (error) return <Error message={error.message} />;return <div>{data.name}</div>;}// Mutation with optimistic updatefunction UpdateUserName({ userId }: { userId: string }) {const queryClient = useQueryClient();const mutation = useMutation({mutationFn: (newName: string) => updateUser(userId, { name: newName }),onMutate: async (newName) => {await queryClient.cancelQueries({ queryKey: ['user', userId] });const previous = queryClient.getQueryData(['user', userId]);queryClient.setQueryData(['user', userId], (old) => ({ ...old, name: newName }));return { previous };},onError: (err, newName, context) => {queryClient.setQueryData(['user', userId], context.previous);},onSettled: () => {queryClient.invalidateQueries({ queryKey: ['user', userId] });},});return <button onClick={() => mutation.mutate('New Name')}>Update</button>;}
Как отвечать на собеседовании
Начните с чёткого утверждения, что работали с библиотекой. Затем кратко перечислите ключевые фичи, которые использовали. Упомяните, что React Query решает проблему "stale-while-revalidate" и синхронизации с сервером. Приведите конкретный пример из опыта - например, как вы настроили кэширование для дашборда с real-time данными. Подчеркните понимание trade-offs: когда использовать React Query, а когда - глобальное состояние (например, для темы или модалок). Если спросят про альтернативы (RTK Query, SWR), будьте готовы сравнить - React Query гибче в настройке кэша и лучше подходит для сложных сценариев.
Что проверяет интервьюер
Интервьюер оценивает:
- Понимание концепции серверного состояния и отличия от клиентского.
- Знание lifecycle запроса (stale, fetching, inactive, garbage collection).
- Умение настраивать кэширование под бизнес-требования (staleTime, gcTime, refetchInterval).
- Опыт с оптимистичными обновлениями и обработкой ошибок.
- Способность интегрировать React Query с существующей архитектурой (например, с React Router для prefetching).
- Понимание, когда React Query избыточен (простые приложения без серверных данных).
Типичные ошибки
- Использование React Query для UI-состояния (например, открыта модалка или нет) - это задача useState/Context.
- Неправильная настройка staleTime: слишком частое обновление (лишние запросы) или слишком редкое (устаревшие данные).
- Игнорирование query keys - непонимание, что ключи должны быть уникальными и включать все зависимости (например,
['user', userId], а не['user']). - Отсутствие обработки ошибок в mutations - не показывать пользователю, что запрос не удался.
- Злоупотребление глобальным queryClient.invalidateQueries без фильтрации - сброс всего кэша вместо конкретных ключей.
- Неиспользование enabled для зависимых запросов - отправка запроса без необходимых данных.
> Похожие задачи по frontend
Нужно ли мутировать массив товаров или создавать его копию для обновления состояния в React?
Почему второй setState не получает измененное значение state в React и как это исправить
Почему возникает ошибка при вызове методов subscribe и getState при монтировании компонента?
Следишь ли за обновлениями React
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью