Правильное соединение редукторов при их комбинировании может быть нецелесообразным

В моем приложении дерево состояний имеет такую ​​форму:

{
    ...otherReducers,
    rooms: Map({
        // room being the room's id
        room: Map({
             id: '',
             name: '',
             users: Map({
                 // user being the user's id
                 user: Map({
                     id: '',
                     name: '',
                     rank: ' '
                 })
             })
        })
    })
}

Чтобы обновить состояние пользователя, я написал свои редукторы следующим образом:

function roomsReducer(state = Map(), action) {
    case USER_RENAME:
        return selectRoom(state, action);
    default:
        return state;
}

function selectRoom(state, action) {
    let room = state.get(action.payload.id);
    return state.set(action.payload.id, roomReducer(room, action));
}

// and so on and so forth until I reach the user I want to update

Есть ли способ, которым я объединяю users редуктор с roomнесмотря на то, что id а также name свойства? Если нет, то есть ли лучший способ управлять своим состоянием, чтобы сделать сокращение более управляемым?

1 ответ

Решение

Это проблема того, как вы структурируете свое состояние. Редактирование пользователей было бы намного проще, если бы оно было нормализовано так:

{
  ...otherReducers,
  rooms: Map({
    5: Map({
      id: '5',
      name: 'some name',
      users: [1,4,52]
    })
  }),
  users: Map({
    1: Map({
      id: '1',
      name: 'Charles',
      range: 'Master'
    }),
    4: Map({
      id: '4',
      name: 'Sally',
      range: 'Master'
    }),
    52: Map({
      id: '52',
      name: 'Harry',
      range: 'Novice'
    })
  })
}
Другие вопросы по тегам