usePageTitle
Описание
usePageTitle — хук, который устанавливает document.title на время жизни компонента. Поддерживает вложенное использование: хранит стек заголовков и при размонтировании восстанавливает предыдущий заголовок (или исходный, если стек пуст).
Сигнатура
ts
function usePageTitle(title: string): void;Параметры
title: string— заголовок страницы, который следует установить на текущем рендере.
Возвращает
void— побочных значений нет; хук управляетdocument.titleи историей заголовков.
Примеры
1) Базовое использование
tsx
import { usePageTitle } from '@webeach/react-hooks';
export function SettingsPage() {
usePageTitle('Settings — MyApp');
return <h1>Settings</h1>;
}2) Вложенные компоненты: приоритет последнего смонтированного
tsx
import { usePageTitle } from '@webeach/react-hooks';
function PageLayout() {
usePageTitle('Dashboard — MyApp');
return <Widget />; // дочерний может переопределить заголовок
}
function Widget() {
usePageTitle('Notifications — MyApp');
return <div />; // пока Widget смонтирован, в заголовке «Notifications — MyApp»
}
// После размонтирования Widget заголовок снова станет «Dashboard — MyApp»3) Реактивное обновление заголовка по пропсам/состоянию
tsx
import { usePageTitle } from '@webeach/react-hooks';
type UserProfileProps = {
name: string;
};
export function UserProfile(props: UserProfileProps) {
const { name } = props;
usePageTitle(`${name} — Profile`);
return <h1>{name}</h1>;
}Поведение
LIFO‑приоритет
- Последний смонтированный
usePageTitleимеет приоритет и определяет текущий заголовок. Обновления «нижних» уровней не отображаются, пока верхний экземпляр не будет размонтирован.
- Последний смонтированный
Восстановление заголовка
- При размонтировании хук снимает свою запись из стека и восстанавливает предыдущий заголовок. Когда стек пуст, возвращается исходный
document.title, считанный при первом использовании хука.
- При размонтировании хук снимает свою запись из стека и восстанавливает предыдущий заголовок. Когда стек пуст, возвращается исходный
Обновление на каждом рендере
- При изменении
titleу текущего экземпляра заголовок обновляется сразу; запись в стеке обновляется без изменения порядка (приоритет остаётся у последнего смонтированного).
- При изменении
Layout‑семантика
- Изменение заголовка выполняется в layout‑фазе (изоморфный layout‑эффект), что гарантирует своевременное применение перед пейнтом на клиенте.
SSR‑безопасность
- На сервере побочных эффектов нет; обращения к
documentпроисходят только после маунта. Хук безопасен для SSR/ISR.
- На сервере побочных эффектов нет; обращения к
Глобальная исходная величина
- Исходный
document.titleсохраняется один раз при первом использовании хука и используется для восстановления после снятия последнего заголовка.
- Исходный
Когда использовать
- Страницы и маршруты SPA/MPA, где компонент отвечает за заголовок вкладки.
- Вложенные виджеты/модальные окна, временно переопределяющие заголовок.
- Динамические заголовки, зависящие от данных (имя пользователя, состояние страницы и т.п.).
Когда не использовать
- Если заголовок управляется роутером/мета‑фреймворком (Next/Remix/React‑Helmet) — избегайте дублирования источников истины, используйте один механизм.
- Если заголовок не должен меняться в зависимости от компонента — достаточно статической разметки.
Частые ошибки
Ожидание приоритета «последнего изменения», а не «последнего маунта»
- Порядок в стеке определяется маунтом, а не временем последнего обновления. Чтобы временно повысить приоритет, монтируйте отдельный экземпляр хука выше по иерархии или размонтируйте текущий верхний.
Жёсткое управление заголовком в нескольких местах одновременно
- Если и роутер, и компоненты меняют заголовок, возможны «перетягивания каната». Выберите единый источник истины.
Попытка читать
documentво время SSR- На сервере
documentнедоступен. Оставьте эту работу хуку — он выполнит изменения на клиенте после маунта.
- На сервере