Организация состояния
Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →
Redux FAQ: Организация состояния
Обязательно ли хранить всё состояние в Redux? Можно ли использовать useState или useReducer из React?
Однозначного ответа не существует. Некоторые разработчики предпочитают хранить каждую частицу данных в Redux, чтобы всегда иметь полностью сериализуемую и контролируемую версию приложения. Другие предпочитают хранить некритичные или UI-состояния, например "открыт ли сейчас выпадающий список", во внутреннем состоянии компонента.
Использование локального состояния компонента — это нормально. Разработчик сам решает, какие типы состояний составляют его приложение и где должно находиться каждое состояние. Найдите баланс, который подходит именно вам.
Общие эмпирические правила для определения, какие данные стоит помещать в Redux:
-
Важны ли эти данные для других частей приложения?
-
Нужно ли создавать производные данные на основе этих исходных данных?
-
Используются ли эти данные для управления несколькими компонентами?
-
Есть ли ценность в возможности восстановить это состояние на определённый момент времени (например, для отладки с перемещением во времени)?
-
Хотите ли вы кэшировать данные (использовать существующие в состоянии вместо повторных запросов)?
-
Нужно ли сохранять согласованность данных при горячей замене компонентов (которые могут терять внутреннее состояние)?
Дополнительные материалы
Статьи
Обсуждения
Можно ли помещать функции, промисы или другие несериализуемые объекты в состояние хранилища?
Настоятельно рекомендуется хранить в хранилище только простые сериализуемые объекты, массивы и примитивы. Технически возможно вставить несериализуемые элементы, но это может нарушить работу механизмов сохранения/восстановления содержимого хранилища, а также помешать отладке с перемещением во времени.
Если вас устраивает, что функции вроде сохранения состояния или отладки с перемещением во времени могут работать некорректно, вы можете размещать несериализуемые элементы в Redux хранилище. В конечном счёте, это ваше приложение, и вы сами решаете, как его реализовывать. Как и со многими аспектами Redux, просто убедитесь, что понимаете связанные компромиссы.
Дополнительные материалы
Обсуждения
Как организовать вложенные или дублирующиеся данные в состоянии?
Данные с идентификаторами, вложенными структурами или взаимосвязями обычно следует хранить в «нормализованном» виде: каждый объект сохраняется один раз с ключом-идентификатором, а другие объекты, ссылающиеся на него, должны хранить только этот ID вместо полной копии. Можно представлять части вашего хранилища как базу данных с отдельными «таблицами» для каждого типа элементов. Библиотеки вроде normalizr и redux-orm помогут управлять нормализованными данными.
Дополнительные материалы
Документация
-
Использование Redux: Структурирование редьюсеров - Базовые концепции
-
Использование Redux: Структурирование редьюсеров - Нормализация формы состояния
Статьи
Обсуждения
-
#946: Лучший способ обновления связанных полей состояния с разделёнными редьюсерами?
-
#994: Как сократить шаблонный код при обновлении вложенных сущностей?
-
#1255: Использование Normalizr с вложенными объектами в React/Redux
-
Stack Overflow: Как обрабатывать древовидные сущности в редьюсерах Redux?
Следует ли хранить состояние форм или другой UI-логики в хранилище?
Те же эмпирические правила применимы и к этому вопросу.
Согласно этим правилам, в большинстве случаев состояние форм не нужно помещать в Redux, так как оно обычно не используется несколькими компонентами. Однако решение всегда зависит от конкретного приложения. Вы можете хранить часть состояния формы в Redux, если редактируете данные из хранилища или если промежуточные значения должны отражаться в других компонентах. С другой стороны, часто проще хранить состояние формы локально в компоненте и диспетчеризовать действие для сохранения данных только после завершения работы с формой.
Исходя из этого, в большинстве случаев вам, вероятно, не нужна и библиотека для управления формами на основе Redux. Рекомендуем попробовать следующие подходы в указанном порядке:
-
Даже если данные поступают из хранилища Redux, начните с ручного написания логики формы. Скорее всего, этого будет достаточно. (См. статьи Гоши Аринича о работе с формами в React для получения отличных рекомендаций.)
-
Если ручное написание форм кажется слишком сложным, попробуйте библиотеки для работы с формами на основе React, такие как Formik или React-Final-Form.
-
Если вы абсолютно уверены, что должны использовать Redux-ориентированную библиотеку, потому что другие подходы недостаточны, рассмотрите Redux-Form или React-Redux-Form.
При хранении состояния формы в Redux учитывайте производительность. Диспетчеризация действия при каждом нажатии клавиши в текстовом поле обычно неоправданна — изучите способы буферизации ввода для локального сохранения изменений перед диспетчеризацией. Всегда анализируйте требования к производительности вашего приложения.
Другие виды UI-состояния следуют тем же принципам. Классический пример — флаг isDropdownOpen. Обычно остальному приложению это не важно, поэтому состояние лучше хранить внутри компонента. Однако для управления диалогами, вкладками или раскрывающимися панелями иногда оправдано использование Redux.
Дополнительные материалы
Статьи