Обработка многих объектов в 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 действительно хорошим вариантом. Его действительно легко обновлять вложенные объекты и массивы. Синтаксис и использование действительно просты.
Я уже ответил на аналогичный вопрос. Добавление ссылки в комментариях