useSessionStorage
Описание
useSessionStorage — хук, который привязывает состояние React к sessionStorage по заданному ключу.
- Инициализирует значение из хранилища (если там есть валидная строка), иначе — из
initialValue. - Возвращает кортеж
[value, setValue]. setValueпринимает как прямое значение, так и функциональный апдейтер(prev) => next.- Поддерживает настраиваемые
serializer/deserializer. - Данные живут в рамках текущей вкладки/окна и очищаются при закрытии сессии браузера (в отличие от
localStorage).
Сигнатура
ts
function useSessionStorage<ValueType = undefined>(
key: string,
initialValue?: undefined,
options?: UseSessionStorageOptions<ValueType>,
): UseSessionStorageReturn<ValueType | undefined>;
function useSessionStorage<ValueType>(
key: string,
initialValue: ValueType | (() => ValueType),
options?: UseSessionStorageOptions<ValueType>,
): UseSessionStorageReturn<ValueType>;Параметры
key— ключ вsessionStorage.initialValue?— начальное значение или фабрика. Используется, если в хранилище нет валидной строки.options?— настройки сериализации:serializer?: (key, value) => string— преобразует значение в строку перед записью.deserializer?: (key, raw) => Value | undefined— парсит строку из хранилища. Вернитеundefined, чтобы считать, что значения нет.
Возвращает:
UseSessionStorageReturn<Value>— кортеж[value, setValue].
Примеры
1) Параметр страницы на время сессии
tsx
const [step, setStep] = useSessionStorage<number>('wizard:step', 1);
const next = () => setStep((prev) => (prev ?? 1) + 1);2) Удаление значения (сброс ключа)
tsx
const [draft, setDraft] = useSessionStorage<string | undefined>('form:draft');
// удалить сохранённое значение и установить state в undefined
setDraft(undefined);3) Кастомные сериализаторы
tsx
type Filter = { q: string; page: number };
const serializer = (_key: string, value: Filter) =>
JSON.stringify({ root: value });
const deserializer = (_key: string, rawValue: string): Filter | undefined => {
const parsed = JSON.parse(rawValue);
return parsed?.root;
};
const [filter, setFilter] = useSessionStorage<Filter>(
'list:filter',
{ q: '', page: 1 },
{ serializer, deserializer },
);Поведение
Инициализация
- При маунте читает строку
rawизsessionStorage[key]и применяетdeserializer. - Если
deserializerвернулundefined, используетсяinitialValue.
- При маунте читает строку
Обновление
setValue(next)записывает новую строку (черезserializer) или удаляет ключ, еслиnext === undefined.- Поддерживается функциональный апдейтер
(prev) => next.
Смена ключа
- При изменении
keyхук перечитывает значение для нового ключа, снова применяяdeserializer.
- При изменении
Область действия и срок жизни
- Значения из
sessionStorageне разделяются между вкладками и очищаются при закрытии вкладки/окна или завершении сессии браузера.
- Значения из
Когда использовать
- Пошаговые мастера, временные фильтры и состояние страниц в рамках одной вкладки.
- Черновики и ввод, который должен переживать перезагрузку, но не закрытие сессии.
- Эфемерные настройки интерфейса для текущего окна.
Когда не использовать
- Нужна долговременная персистентность между сессиями — используйте
useLocalStorage. - Большие или сложные структуры — рассмотрите
IndexedDB. - Конфиденциальные данные без шифрования.
Частые ошибки
Ожидание разделения между вкладками
sessionStorageизолирован по вкладкам; не синхронизируется автоматически.
Ожидание возврата
initialValueпослеsetValue(undefined)- В текущем маунте
valueстанетundefined.initialValueприменяется только при следующем маунте (если ключ отсутствует в хранилище).
- В текущем маунте
Несогласованный формат сериализации
- При изменении
serializer/deserializerстарые значения могут не распарситься; планируйте миграции.
- При изменении
Типизация
Экспортируемые типы
UseSessionStorageReturn<Value>—[value: Value, setValue: (action) => void].UseSessionStorageOptions<Value>— опцииserializer/deserializer.UseSessionStorageSetAction<Value>—Value | ((prev: Value) => Value).