Опубликовано изначально на среднем
Сохранять реакцию Уместите к LocalStorage это общее требование. Вы хотели бы сохранить предпочтения или данные пользователя, чтобы они были под рукой на следующих сессиях. Тем не менее, есть некоторые ошибки, которые трудно отслеживать при этом. Эта статья представит их и объяснит, как их решите их эффективно.
Предположим, что мы добавим новые настройки, чтобы разрешить пользователям включить темный режим на нашем сайте. Что-то вроде этого:
Внутренне мы сохраним внутреннее состояние, используя React’s Уместите хранить следующее:
- Название: этикетка для отображения в интерфейсе UI
- Имя: для ссылки на поле ввода и сможет получить наше сохраняемое состояние, даже если мы обновим его заголовок.
- Включено: Указывает, если флажок проверяется или нет.
Чтобы сохранить это состояние, мы будем использовать Regive Уместите Крюк на данный момент:
Я опускаю детали макета и логику, используемые для включения/отключения каждого варианта, поскольку находится за пределами идеи этой статьи. Так вот наш интерфейс И это связанное состояние:
Вот как это выглядит, когда DEEM MODE отключен:
Теперь у нас наши данные управляются пользовательским интерфейсом, готовым к сохранению, поэтому мы сделаем это сейчас.
Чтобы сохранить наше государство, мы будем использовать USELOCALSTORAGE крюк:
Обратите внимание, что нам нужно указать Варианты в качестве первого параметра. Это потому, что Реактивные крючки полагаются на вызов Заказать Так что нет надежного способа сохранять состояние без имени. Вот почему мы используем опции как имя для ссылки нашего государства. Нам нужно быть осторожным, чтобы не использовать это имя в нескольких местах (если мы не хотим использовать одно и то же состояние в нашем приложении, в этом случае пользовательский крючок будет лучшим вариантом, чтобы сохранить форму состояния в синхронизации).
Путь USELOCALSTORAGE Работы выглядят следующим образом: Если нет данных на LocalStorage Установите состояние в исходное состояние. Если есть данные на LocalStorage Установите состояние в хранимое состояние.
Вот визуализация нашего пользовательского интерфейса и его связанного состояния и локального контента:
Теперь у нас есть наши данные, управляемые данными, сохраняются UI. Посмотрим, какие проблемы происходят, когда мы стараемся добавлять новые варианты.
Добавим новую конфигурацию для включения режима экономии данных:
Легко, мы добавляем только новый вариант в наше новое состояние:
Мы сохраняем наши изменения, но видим это:
Мы обновляем браузер и перезагрузите приложение, но UI не обновляется. Однако, если вы откроете наше приложение в новом окне Incognito, вы увидите новую интерфейс:
Что случилось? Вопрос лежит на данных, которые мы сохранили на LocalStorage:
Как описано ранее, USELOCALSTORAGE Крюк будет загружать данные из LocalStorage Если он присутствует, так что он загружает эти данные как наше государство:
Однако на вкладке Incognito (или после удаления LocalStorage данные), нет данных в локальная табличка Итак, Варианты Государство будет предусмотренным начальным государством:
Самое простое решение было бы просто удалить LocalStorage данные и продолжать. Тем не менее, Что происходит с пользователями, которые уже видели страницу настроек на производстве? Они будут иметь несвежие данные, и поэтому не смогут увидеть нашу новую настройку сохранения данных.
Одно простое решение можно для обновления имени на LocalStorage для нашего штата. Например, добавьте какую-то версию, как опция-V1. Когда в исходном значении есть изменение, вы можете увеличить версию на опцию-V2, опцию V3 и т. Д. Недостаток в том, что мы получим ненужное пространство для наших пользователей:
UsePersistedstate Решает проблему версий, сохраняя уникальный идентификатор для прилагаемого начального значения:
Когда мы изменяем наше начальное значение, исходное состояние автоматически загружается и предыдущие данные на LocalStorage обновляется автоматически ✨:
Как это работает, заключается в следующем. Если нет сохраняемых данных, то загрузите состояние из исходного состояния. Однако, если есть данные, уникальный хеш рассчитывается для исходного состояния и сравнивается с сохраненным:
Если хэши совпадают, состояние будет загружено из LocalStorage Отказ Если они не совпадают, он не будет рассмотрен и будет переопределен новым состоянием по умолчанию.
Если вам нужна поддержка боковой поддержки сервера при постоянном состоянии, имейте в виду, что данные из LocalStorage Не может быть прочитано с сервера, поэтому вам нужно задержать загрузку данных, пока компонент не будет установлен на клиенте (работает для этого Whate ExateFect для этого). UsePersistedstate Обрабатывает это автоматически для вас, поэтому вам не нужно беспокоиться об этом.
Если вы беспокоитесь о производительности расчета хеша для исходного состояния, я сделал небольшой тест и запустил хеш-функцию в 1000 раз, и потребовалось менее 230 мс. Что равно до 0,23 мс для каждого пробега, поэтому не имеет большого значения.
В этой статье я представляю вас об общих вопросах при постоянном состоянии до LocalStorage Отказ Мы увидели простое способом автоматической адаптации к изменениям и избежать трудно найти ошибки одновременно. Если вы еще этого не сделали, я призываю вас использовать UsePersistedstate Для этого. Я строю его с ❤️ и тяжелой работой, чтобы вам не нужно. Вы можете найти меня на Twitter если у вас есть какие-нибудь вопросы.
Оригинал: “https://dev.to/giovannibenussi/persisting-state-on-react-apps-331c”