0Pricing
React Academy · Урок

Синхронизация состояния с localStorage

Создайте пользовательский хук useLocalStorage, который синхронизирует состояние React и localStorage в обоих направлениях.

«Синхронизация состояния с localStorage» — бесплатный урок React Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Наивный подход приводит к рассинхронизации

Сначала может показаться удобным считывать localStorage в одном месте, а записывать в другом, но со временем эти части могут разойтись. Ошибки возникают, когда обновления состояния не сохраняются или сохранённые значения не отражаются в состоянии.

Вам нужен единый источник истины, который поддерживает состояние React и хранилище в полном соответствии.

Пользовательский хук useLocalStorage

Аккуратное решение — хук useLocalStorage, который оборачивает useState и автоматически сохраняет изменения. Он возвращает значение и функцию его установки, как и useState.

Использующий его код работает с ним так же, как с обычным состоянием, но получает сохранение данных без дополнительных усилий.

Функция ленивой инициализации

Чтение localStorage — синхронная операция, поэтому не следует выполнять её при каждом рендеринге. Передайте функцию в useState в качестве ленивого инициализатора, чтобы чтение выполнялось только один раз при монтировании.

Внутри этой функции разберите сохранённое значение или верните заданное значение по умолчанию.

Почему ленивая инициализация важна

Если вычислять начальное состояние непосредственно в аргументе, это выражение будет выполняться при каждом рендеринге, хотя после первого оно игнорируется. При передаче функции React вызывает её только один раз.

Для чтения localStorage это предотвращает повторную синхронную работу в основном потоке при каждом рендеринге.

Синхронизация с помощью useEffect

Чтобы сохранять обновления, добавьте useEffect, который выполняется при каждом изменении значения и вызывает localStorage.setItem(key, JSON.stringify(value)).

Если поместить значение в массив зависимостей, каждое изменение состояния будет автоматически записываться в хранилище.

Функциональные обновления предотвращают устаревшие замыкания

При установке значения на основе предыдущего используйте функциональную форму setValue(prev => prev + 1). Это предотвращает устаревшие замыкания, из-за которых записывалось бы старое захваченное значение.

Это особенно важно внутри обработчиков событий и эффектов, которые могут захватить устаревший снимок состояния.

Обработка отсутствующего сохранённого значения

getItem возвращает null, если ключ не существует. Инициализатор должен обнаружить это и использовать значение по умолчанию, а не пытаться разобрать null.

Такая проверка, как stored != null ? JSON.parse(stored) : defaultValue, корректно обрабатывает первое посещение.

Обобщения TypeScript

В TypeScript сделайте хук обобщённым: function useLocalStorage<T>(key: string, initial: T). Это сохраняет тип значения, поэтому использующий хук код получает полную безопасность типов.

Возвращаемый кортеж имеет тип [T, Dispatch<SetStateAction<T>>], как и у useState.

Версионирование сохранённых данных

Со временем структура данных меняется, и старые сохранённые значения могут нарушить работу нового кода. Храните рядом с данными ключ версии, чтобы обнаруживать устаревшие форматы.

Например, сохраните { version: 2, data } и сравнивайте версию при чтении.

Удаление данных при несовпадении версий

Если сохранённая версия не совпадает с текущей, удалите старое значение или преобразуйте его, вместо того чтобы безоговорочно ему доверять. Самая простая стратегия — удалить устаревшую запись и использовать значения по умолчанию.

Это предотвращает сбои из-за данных, записанных старой версией приложения.

Собираем хук целиком

Полный useLocalStorage объединяет ленивый инициализатор, который безопасно считывает и разбирает данные, функцию установки с поддержкой функциональных обновлений и useEffect, который записывает изменения с учётом версии.

В результате получается готовая замена useState, сохраняющая данные после перезагрузки.

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете инициализацию состояния.

Итоги

Вы научились создавать хук useLocalStorage с ленивым инициализатором, сохранять изменения через useEffect, использовать функциональные обновления для предотвращения устаревших замыканий и обрабатывать отсутствующие значения.

Кроме того, Вы познакомились с обобщениями TypeScript и версионированием, позволяющим безопасно удалять устаревшие данные.

Часто задаваемые вопросы

Урок «Синхронизация состояния с localStorage» бесплатный?

Да — полный текст урока «Синхронизация состояния с localStorage» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «Синхронизация состояния с localStorage»?

Создайте пользовательский хук useLocalStorage, который синхронизирует состояние React и localStorage в обоих направлениях. Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Синхронизация состояния с localStorage»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Чтение и запись в localStorage в React
  2. Синхронизация состояния с localStorage
  3. Обработка событий хранилища между вкладками
  4. sessionStorage, IndexedDB и выбор подходящего API
← Назад к React Academy