usePageVisibility
Описание
usePageVisibility — хук, который отслеживает видимость страницы (visible/hidden) через событие visibilitychange. Возвращает гибридную структуру с текущим флагом isVisible и (опционально) вызывает колбэк при каждом изменении видимости.
- Кортеж:
[isVisible] - Объект:
{ isVisible }
Сигнатура
ts
function usePageVisibility(
callback?: UsePageVisibilityCallback,
): UsePageVisibilityReturn;Параметры
callback?— функция, вызываемая при каждом изменении видимости:(isVisible: boolean) => void.
Возвращает:
UsePageVisibilityReturn— гибридная структура со свойством/элементомisVisible: boolean.
Примеры
1) Показ индикатора активности вкладки
tsx
import { usePageVisibility } from '@webeach/react-hooks';
export function PageActivityBadge() {
const { isVisible } = usePageVisibility();
return <div>{isVisible ? '🟢 Вкладка активна' : '⚪️ Вкладка неактивна'}</div>;
}2) Пауза/резюм анимации (через класс)
tsx
import { usePageVisibility } from '@webeach/react-hooks';
export function Spinner() {
const { isVisible } = usePageVisibility();
return <div className={isVisible ? 'spinner' : 'spinner spinner--paused'} />;
}Поведение
Семантика
isVisible- Значение отражает
document.visibilityState === 'visible'и обновляется на событиеvisibilitychange.
- Значение отражает
Опциональный колбэк
- При каждом изменении видимости вызывается
callback?.(isVisible). Колбэк всегда вызывается, даже если компонент не читаетisVisibleв UI.
- При каждом изменении видимости вызывается
Обновления только при использовании
- Если
isVisibleне читался (например, вы используете только колбэк), лишний ререндер не инициируется.
- Если
SSR/ISR‑безопасность
- На сервере
isVisibleсчитаетсяtrue; подписка на события происходит только после маунта. После первого клиента может прийти реальное значение и произойти обновление.
- На сервере
Стабильность интерфейса
- Возвращаемая структура стабильно содержит лишь
isVisible; удобна для кортежной и объектной деструктуризации.
- Возвращаемая структура стабильно содержит лишь
Когда использовать
- Приостановка поллинга/таймеров/анимаций на скрытой вкладке.
- Отключение тяжёлых вычислений и сетевых запросов, пока пользователь неактивен.
- Изменение UI‑индикаторов «онлайн/неактивен», отображение бейджей.
Когда не использовать
- Если логика не зависит от видимости вкладки.
- Если требуется более детальная телеметрия активности (фокус окна,
pointermove,visibilitychangeдокумента и т.п.) — используйте соответствующие хуки/события совместно.
Частые ошибки
Ожидание ререндера без чтения
isVisible- Если вы не используете
isVisibleв разметке/логике, компонент не будет перерисован — используйте колбэк для побочных действий.
- Если вы не используете
Тяжёлая работа внутри колбэка
- Избегайте тяжёлых операций в обработчике видимости; выносите их в отложенные задачи/воркеры.
Опора на начальное значение при SSR
- Помните, что на сервере
isVisible = true; сразу после маунта значение может измениться.
Типизация
Экспортируемые типы
UsePageVisibilityCallback- Колбэк, вызываемый при изменении видимости документа:
(isVisible: boolean) => void.
- Колбэк, вызываемый при изменении видимости документа:
UsePageVisibilityReturn- Гибридный тип: кортеж
[isVisible]и объект{ isVisible }.
- Гибридный тип: кортеж
UsePageVisibilityReturnObject- Объектная форма:
{ isVisible: boolean }.
- Объектная форма:
UsePageVisibilityReturnTuple- Кортежная форма:
[isVisible: boolean].
- Кортежная форма: