Подписка на API браузера
Создавайте хуки, подписывающиеся на matchMedia, navigator.onLine, историю окна и localStorage с помощью useSyncExternalStore.
«Подписка на API браузера» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Подписка на matchMedia
Браузерные медиазапросы — отличный пример внешнего хранилища. Вы можете подписаться на запрос matchMedia для темной темы или контрольной точки и выполнять повторный рендеринг при каждом изменении состояния соответствия.
Функция подписки добавляет слушателя изменений к MediaQueryList, а getSnapshot возвращает текущее логическое значение, показывающее соответствие, предоставляя реактивный доступ к условиям адаптивного интерфейса.
Хук useMediaQuery
Если объединить эту логику в хук useMediaQuery, компоненты смогут проверять соответствие запроса одним вызовом. Хук создает стабильные функцию подписки и getSnapshot для заданной строки запроса.
В результате получается чистый переиспользуемый примитив для адаптивного поведения, сохраняющий корректность при конкурентном рендеринге благодаря useSyncExternalStore.
Состояние navigator.onLine
Браузер предоставляет события подключения и отключения от сети, а также navigator.onLine. Подписка на эти события и чтение свойства дают React актуальный статус подключения.
getSnapshot возвращает navigator.onLine, а функция подписки подключает слушателей событий перехода в онлайн- и офлайн-режим, поэтому компонент обновляется при изменении подключения.
Хук useOnlineStatus
Если объединить эту логику в хук useOnlineStatus, любой компонент сможет показывать баннеры об отсутствии подключения или отключать действия при сбое сети. Именно этот пример приведен в официальной документации React для демонстрации хука.
Это небольшой, но наглядный случай, когда внешний сигнал браузера естественно преобразуется в часть реактивного состояния.
Подписка на window.location
Вы можете отслеживать изменения навигации, слушая события изменения истории браузера и считывая window.location в getSnapshot. На этом основаны простые пользовательские маршрутизаторы, построенные на API истории.
Поскольку pushState не вызывает событие изменения истории, пользовательские маршрутизаторы часто отправляют собственное событие, чтобы снимок обновлялся и при программной навигации.
Синхронизация localStorage между вкладками через событие хранилища
Событие хранилища срабатывает в других вкладках при изменении localStorage, поэтому на него можно подписаться как на внешнее хранилище. getSnapshot считывает текущее значение, а функция подписки слушает события хранилища.
Это обеспечивает синхронизацию между вкладками: изменение значения в одной вкладке реактивно обновляет компоненты в другой.
deviceOrientation
Событие ориентации устройства сообщает о его физическом наклоне. Подписка на него и чтение последних углов в getSnapshot превращают данные о движении в реактивное состояние.
Это полезно для эффектов параллакса и интерактивных визуализаций, реагирующих на положение телефона в руке.
Обертка над IntersectionObserver
IntersectionObserver сообщает, когда элемент входит в область просмотра или покидает ее. Вы можете обернуть его так, чтобы функция подписки создавала наблюдатель, а getSnapshot возвращал последнее значение isIntersecting.
Так Вы получаете реактивный флаг isVisible для отложенной загрузки изображений, запуска анимаций или реализации маркеров бесконечной прокрутки.
ResizeObserver для определения размера элемента
ResizeObserver сообщает об изменениях размера элемента. Его обертка позволяет функции подписки наблюдать за элементом, а getSnapshot — возвращать его текущие размеры, поэтому компоненты точно реагируют на изменения макета.
Это эффективнее и точнее, чем отслеживать изменение размера окна, если Вас интересует конкретный элемент, а не вся область просмотра.
Создание useWindowSize с помощью композиции
Вы можете объединить событие изменения размера с хуком и создать useWindowSize, возвращающий текущие ширину и высоту. Функция подписки подключает слушателя изменения размера, а getSnapshot считывает размеры окна.
Помните о необходимости возвращать стабильный снимок: кэшируйте объект размеров, чтобы неизменившиеся размеры не вызывали повторный рендеринг и композиция оставалась эффективной.
Быстрая проверка: реализация useMediaQuery
Разберитесь, как хук useMediaQuery использует хук хранилища.
Итоги: подписка на API браузера
Многие API браузера являются внешними хранилищами, которые можно подключить с помощью useSyncExternalStore: matchMedia — для контрольных точек, navigator.onLine — для подключения, адрес и хранилище — для навигации и синхронизации между вкладками, а также наблюдатели ориентации, пересечений и изменения размера.
У всех одинаковая структура: функция подписки, добавляющая и удаляющая слушателей, и стабильный getSnapshot. Объединяйте их в такие хуки, как useMediaQuery, useOnlineStatus и useWindowSize.
Часто задаваемые вопросы
Урок «Подписка на API браузера» бесплатный?
Да — полный текст урока «Подписка на API браузера» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Подписка на API браузера»?
Создавайте хуки, подписывающиеся на matchMedia, navigator.onLine, историю окна и localStorage с помощью useSyncExternalStore. Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Подписка на API браузера»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Проблема подписок на внешнее хранилище
- API и параметры useSyncExternalStore
- Подписка на API браузера
- Создание пользовательского хранилища с useSyncExternalStore