Хук useSWR: загрузка, состояние загрузки и ошибки
Используйте useSWR с пользовательскими функциями загрузки и декларативно обрабатывайте состояния загрузки, ошибки и успеха
«Хук useSWR: загрузка, состояние загрузки и ошибки» — бесплатный урок React Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Сигнатура useSWR
useSWR(key, fetcher, options) — основной хук. key — это ключ кэша (обычно строка URL), fetcher — асинхронная функция, возвращающая данные, а options — необязательный объект конфигурации.
Хук возвращает объект с полями data, error, isLoading, isValidating и функцией mutate.
Параметр ключа
Ключом может быть строка URL, массив [url, params] или null. Строковые ключи соответствуют простым GET-запросам. Ключи-массивы позволяют включать такие переменные, как userId или фильтры, в идентификатор кэша.
Передача null полностью отключает запрос; это удобно для условного получения данных, когда необходимые данные ещё недоступны.
Функция получения данных
Функция получения данных получает ключ (или элементы ключа-массива в виде отдельных аргументов) и должна возвращать Promise. Полученное значение становится значением data. Если функция получения данных выдаёт исключение, устанавливается свойство error.
Пример: (url) => fetch(url).then(r => { if (!r.ok) throw new Error(r.status); return r.json(); }).
Состояния data и error
При первой загрузке data имеет значение undefined, а после успешного выполнения содержит значение, возвращённое функцией получения данных. error имеет значение undefined, если функция получения данных не выдала исключение; в противном случае в нём хранится объект выданной ошибки.
Проверяйте if (error), чтобы отобразить сообщение об ошибке, и if (!data), чтобы показать каркас загрузки и предоставить понятные резервные интерфейсы.
isLoading и isValidating
isLoading имеет значение true только при отсутствии кэшированных данных и выполняющемся запросе — во время самой первой загрузки этого ключа. isValidating имеет значение true каждый раз, когда выполняется запрос, включая фоновые ревалидации при наличии кэшированных данных.
Используйте isLoading для экранов загрузки, а isValidating — для ненавязчивого индикатора фонового обновления.
Глобальный SWRConfig
SWRConfig позволяет задать функцию получения данных по умолчанию, dedupingInterval, refreshInterval, обработчик onError и другие параметры для всех вызовов useSWR внутри своего поддерева. Это централизует конфигурацию и избавляет от повторения параметров в каждом хуке.
Вкладывайте несколько провайдеров SWRConfig, чтобы задавать разные значения по умолчанию для разных разделов приложения.
Условное получение данных с нулевым ключом
Передайте null в качестве ключа, чтобы пропустить запрос: useSWR(isLoggedIn ? '/api/user' : null, fetcher). SWR не будет выполнять запрос, пока ключ не станет ненулевым значением.
Это понятнее, чем параметр skip в React Query. Переход ключа от null к строке автоматически запускает первый запрос.
Зависимое получение данных
Объединяйте хуки SWR для зависимых запросов: const { data: user } = useSWR('/api/me', fetcher) затем const { data: orders } = useSWR(user ? '/api/orders/' + user.id : null, fetcher). Второй хук ожидает завершения первого.
Этот подход избавляет от цепочек useEffect и сохраняет зависимости данных декларативными и понятными.
Устранение дубликатов запросов на практике
Если компоненты Header и Sidebar оба вызывают useSWR('/api/user', fetcher), SWR выполняет только один запрос и передаёт его результат обоим компонентам. Оба компонента перерисовываются одновременно при обновлении data или error.
Это устранение дубликатов происходит автоматически в течение окна dedupingInterval (по умолчанию 2000 мс), без дополнительной настройки.
Полезные параметры SWR
refreshInterval: 5000 выполняет опрос каждые 5 секунд. refreshWhenHidden: false прекращает опрос, когда вкладка невидима. shouldRetryOnError: false отключает автоматический повтор. revalidateOnFocus: false отключает ревалидацию при возвращении фокуса.
Комбинируйте параметры в соответствии с требованиями к актуальности данных: в панелях мониторинга часто используют refreshInterval, а для статического содержимого задают revalidateOnFocus: false.
Постраничная загрузка с useSWR
Для постраничных данных включите номер страницы в ключ: useSWR(['/api/items', page], fetcher). При смене страницы запускается новый запрос для этой страницы, а предыдущие страницы кэшируются.
SWR также предоставляет useSWRInfinite для сценариев с курсорами или бесконечной прокруткой, используя функцию getKey, которая формирует ключи на основе индекса страницы и данных предыдущей страницы.
Ключ SWR равен null
Что происходит, если передать null в качестве ключа для useSWR?
Итоги урока
useSWR(key, fetcher) возвращает data, error, isLoading и isValidating. Ключи null отключают получение данных для условных и зависимых запросов. isLoading обозначает первую загрузку, а isValidating — любой выполняющийся запрос. SWRConfig централизует значения по умолчанию, а устранение дубликатов запросов между компонентами происходит автоматически.
Такие параметры, как refreshInterval, revalidateOnFocus и shouldRetryOnError, позволяют настраивать поведение, связанное с актуальностью данных, для отдельного хука или глобально.
Часто задаваемые вопросы
Урок «Хук useSWR: загрузка, состояние загрузки и ошибки» бесплатный?
Да — полный текст урока «Хук useSWR: загрузка, состояние загрузки и ошибки» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Хук useSWR: загрузка, состояние загрузки и ошибки»?
Используйте useSWR с пользовательскими функциями загрузки и декларативно обрабатывайте состояния загрузки, ошибки и успеха Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Хук useSWR: загрузка, состояние загрузки и ошибки»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основные понятия SWR: устаревшие данные с обновлением
- Хук useSWR: загрузка, состояние загрузки и ошибки
- Мутации и оптимистичные обновления с SWR
- SWR и React Query: выбор подходящего инструмента