> Какие опции есть у useSWR или useSWRData (React)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Библио-Глобус
Стек: React
> Пример ответа
Короткий ответ
useSWR и useSWRData принимают три основных аргумента: ключ (key), fetcher-функцию и объект опций. Ключевые опции включают revalidateOnFocus, revalidateOnReconnect, refreshInterval, dedupingInterval, errorRetryCount, loadingTimeout, fallbackData, keepPreviousData, onSuccess, onError, onErrorRetry, compare, isPaused, fallback, use, revalidateIfStale, revalidateOnMount, shouldRetryOnError, errorRetryInterval и focusThrottleInterval.
Подробное объяснение
useSWR - это хук для кэширования и ревалидации данных, построенный на стратегии stale-while-revalidate. Опции делятся на несколько категорий:
Управление ревалидацией:
revalidateIfStale(default: true) - ревалидировать ли данные при монтировании, если есть закэшированные данныеrevalidateOnMount(default: true) - ревалидировать при первом монтированииrevalidateOnFocus(default: true) - ревалидировать при фокусе окнаrevalidateOnReconnect(default: true) - ревалидировать при восстановлении сетиrefreshInterval(default: 0) - интервал автоматической ревалидации в msrefreshWhenHidden(default: false) - продолжать ли refresh, когда вкладка неактивнаrefreshWhenOffline(default: false) - продолжать ли refresh при офлайн
Управление кэшем и дедупликацией:
dedupingInterval(default: 2000ms) - интервал дедупликации одинаковых запросовfocusThrottleInterval(default: 5000ms) - минимальный интервал между ревалидациями при фокусеloadingTimeout(default: 3000ms) - таймаут для состояния loadingerrorRetryInterval(default: 5000ms) - интервал между повторными попытками при ошибкеerrorRetryCount(default: infinite) - максимальное количество ретраев
Управление данными:
fallbackData- начальные данные до загрузкиkeepPreviousData(default: false) - сохранять ли предыдущие данные при загрузке новыхcompare- функция сравнения для определения изменения данныхisPaused- функция, возвращающая true для приостановки ревалидацииfallback- глобальный объект с fallback данными для ключей
Колбэки:
onSuccess- вызывается после успешной загрузкиonError- вызывается при ошибкеonErrorRetry- вызывается перед повторной попыткой при ошибке
Middleware:
use- массив middleware функций для расширения функциональности
На практике
Наиболее часто используемые опции в production:
refreshInterval- для polling данных в реальном времени (например, статус задачи)revalidateOnFocus- часто отключают для избежания лишних запросовkeepPreviousData- для плавного UX при переключении страницfallbackData- для SSR/SSG с Next.jserrorRetryCount- для контроля количества ретраев
Важно понимать trade-off: слишком частые ревалидации могут нагружать сервер, а слишком редкие - показывать устаревшие данные.
Пример кода
TYPESCRIPTimport useSWR from 'swr'// Базовая конфигурация с pollingconst { data, error, isValidating } = useSWR('/api/user',fetcher,{refreshInterval: 30000, // обновление каждые 30 секундrevalidateOnFocus: false, // отключаем ревалидацию при фокусеkeepPreviousData: true, // сохраняем старые данные при загрузкеerrorRetryCount: 3, // максимум 3 ретраяonSuccess: (data) => {console.log('Data loaded:', data)},onError: (err) => {console.error('Failed to load:', err)}})// Конфигурация для SSR с fallbackconst { data } = useSWR('/api/posts',fetcher,{fallbackData: initialPosts, // данные с сервераrevalidateIfStale: false, // не ревалидировать при монтировании})
Как отвечать на собеседовании
Начни с перечисления основных опций, затем сгруппируй их по назначению. Покажи понимание, когда какую опцию использовать. Упомяни, что опции можно задавать глобально через SWRConfig. Приведи примеры из реальной практики: polling для чата, отключение ревалидации для статичных данных, fallback для SSR.
Что проверяет интервьюер
- Глубину знания библиотеки, а не только базового использования
- Понимание концепции stale-while-revalidate
- Умение выбирать правильные опции под конкретные сценарии
- Знание оптимизаций: дедупликация, throttling, retry logic
- Понимание работы с кэшем и состояниями загрузки
Типичные ошибки
- Путаница между
fallbackDataиfallback(глобальный vs локальный) - Забывают про
keepPreviousDataдля плавного UX - Не отключают
revalidateOnFocusдля часто обновляемых данных - Используют
refreshIntervalбез учетаrefreshWhenHidden - Не настраивают
errorRetryCount, что ведет к бесконечным ретраям - Путают
isValidatingиisLoading(первый true при любой ревалидации, второй только при первой загрузке)
> Похожие задачи по frontend
Как работать с loading и data из useQuery
Как называется алгоритм сравнения деревьев в React
Как работает lazy загрузка в useSWR
Как вызвать useSWR по нажатию на кнопку, чтобы он не вызывался сразу
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью