Обработка многих объектов в Redux без повторов

Я создаю приложение React + Redux, но я не уверен, что делать с этим редуктором.

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

// Updates an entity cache in response to any action with response.entities.

const entities = (state = initialState, action) => {
  if (action.response && action.response.entities) {
    return merge({}, state, action.response.entities)
  }

  return state
}

Вопрос заключается в следующем: как я могу обработать обновление вложенной сущности? Все уже нормализовано, так что это будет вопрос получения ключей и их обновления, но я не могу понять, как.

Я мог бы использовать пример из документации, но он показывает только, как решить простой случай, когда есть только 2 объекта, поэтому у меня может быть один редуктор для каждого. У меня есть 8 (и, возможно, больше) сущностей, и было бы много работы, чтобы создать по одному редуктору для каждого, с каждым действием по извлечению и получению, но, может быть, именно такой подход я должен предпринять?

2 ответа

Один из вариантов - добавить обработчик типа действия внутри этой функции редуктора.

const entities = (state = initialState, action) => {
   if (action.type === 'UPDATE_ENTITY') {
      return {
          ...state,
          [action.payload.entity]: {
              ...state[action.payload.entity],
              [action.payload.id]: {
                  ...state[action.payload.entity][id],
                  [action.payload.field]: action.payload.value
              }
          }
      }
   }

   if (action.response && action.response.entities) {
      return merge({}, state, action.response.entities)
   }

   return state
}

Ваши действия могут выглядеть примерно так

const updateEntity = (entity, id, field, value) => ({
    type: 'UPDATE_ENTITY',
    payload: {entity, id, field, value}
})

Это только один из способов. Есть много других подходов в зависимости от вашего варианта использования.

Для работы с вложенными объектами я считаю immutablejs действительно хорошим вариантом. Его действительно легко обновлять вложенные объекты и массивы. Синтаксис и использование действительно просты.

Я уже ответил на аналогичный вопрос. Добавление ссылки в комментариях

Другие вопросы по тегам