Преобразовать объект / нормализованный ответ - PullRequest
0 голосов
/ 26 ноября 2018

Интересно, где хорошее место для преобразования объекта (ов) ответа, прежде чем он будет установлен в моем состоянии Redux.

Пример

  • Iесть chat_message сущность
  • Имеет логическое свойство read, отправленное сервером
  • Мне нужно вычислить новое логическое свойство unread = !message.read && message.user_id !== currentUser.id

Вопросы

  1. Вычислить ли этот новый атрибут в селекторе getChatMessages (reselect)?
  2. Вычислить этот новый атрибутпрежде чем установить нормализованный ответ в моем состоянии?- Отсюда мой вопрос «Преобразование»
  3. Должен ли я просто вычислить его в моем Component, но эта (простая) логика не разделяется и не дублируется повсеместно ...
  4. Должен ли яотправить атрибут unread с сервера ...

Примечания

  • unread Пример примера является упрощенным.
  • Мне не нравится решение 1. В любом случае вам нужно разделить эту логику между селекторами.Таким образом, у вас может быть вспомогательная функция isMessageUnread, совместно используемая селекторами getLastChatMessage, getChatMessages.Мне также не нравятся селекторы, выполняющие слишком много логики.
  • Я бы склонялся к решению 2. Новый атрибут unread вычисляется только при получении ответа.
  • Решение 3. Мой текущий ленивыйрешение (с экспериментами тут и там, но на самом деле ничего окончательного)
  • Мне не нравится решение 4. Эти атрибуты больше связаны с пользовательским интерфейсом, чем с бэкэндом.
  • При использовании решения 2.Я чувствую, что reducers не очень хорошее место для таких трансформаций.Может быть легко для простых объектов, но как насчет «тяжелого» преобразования (итерации по коллекциям, проверка отношений и т. Д.)?Я бы предпочел поместить эту новую логику вне: селекторов, редукторов и сущностей.Вроде как нормализр "плагин" / перехватчик / преобразователь / постпроцессор ...

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Normalizr предоставляет опцию processStrategy :

Стратегия, используемая при предварительной обработке объекта.Используйте этот метод для добавления дополнительных данных, значений по умолчанию и / или полного изменения объекта до завершения нормализации.

0 голосов
/ 26 ноября 2018

Решение зависит от того, как будет использоваться атрибут:

  • Является ли атрибут unread специфичным для одного компонента для его цели визуализации и не используется где-либо еще.Например: точка уведомления.Если да, то вы можете использовать решение 3, так как вы можете локализовать использование внутри компонента.

  • Если атрибут unread, должен быть общим для компонентов / промежуточного программного обеспечения, поместивлогика в селектор / редуктор это путь.Но если вы устанавливаете редуктор, спросите, требуется ли unread всем компонентам, подписавшимся на сущность chatBox.Если нет, то лучше поместить его в селектор, который может быть вызван только теми компонентами / промежуточным программным обеспечением, которые в нем нуждаются.Существует компромисс между дополнительными вычислениями во время выполнения, но они обеспечивают правильное разделение задач, поскольку в конечном итоге это принесет пользу, если в будущем появятся еще такие производные атрибуты.

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