Как лучше организовать редьюсер в Redux?

Всем привет! Подскажите, как лучше организовать структуру редьюсера(ов), если мне нужно вывести такое дерево:

root
--array1:
----[0]: { id: 1, elements: [1,1,1,1] }
----[1]: { id: 2, elements: [1,1,1,1] }
----[2]: { id: 3, elements: [1,1,1,1] }

В редьюсер приходить будут экшены как на добавление элементов array1. так и на добавление элементов в elements.
Как лучше это организовать? Элементы вынести в отдельный редьюсер? Не могли бы еще показать, как в данном случае мне добавить элемент в elements?

Является ли такой вариант верным?
case ADD_ELEMENT:
    var array2 = state.array1;
    array2[arrayIndex].elements.push({
      name: action.name
    })
    return {
      ...state,
      array1: [...array2],
    }
  • Вопрос задан
  • 955 просмотров
Решения вопроса 1
Насколько я понял, у вас есть две сущности (одна - root и одна в elements). Тогда это дело лучше хранить в нормализованном состоянии: делам два редьюсера, каждый работает со своей сущностью, а в селекторе денормализуем. При этом хранить сущности удобнее как { id: entity } объект, а не как массив.

// rootEntity reducer
const initialState = {
  entities: {}
}

function rootEntityReducer(state = initialState, action = {}) {
  switch(action.type) {
    case ADD_ELEMENT:
      const { targetEntityId, element } = action.payload
      const targetEntity = state.entities[targetEntityId]
      return {
        ...state,
        entites: {
          ...state.entities,
          [targetEntityId]: { ...targetEntity, elements: [ ...targetEntity.elements, element ] }
        }
      }
    default:
      return state
  }
}


UPD1 если entities - массив

// rootEntity reducer
const initialState = {
  entities: []
}

function rootEntityReducer(state = initialState, action = {}) {
  switch(action.type) {
    case ADD_ELEMENT:
      const { targetEntityId, element } = action.payload

      return {
        ...state,
        entites:  state.entities.map(
          entity => entity.id !== targetEntityId
            ? entity
            : { ...entity , elements: [ ...entity.elements, element ] }
        )
      }
    default:
      return state
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы