Правильное соединение редукторов при их комбинировании может быть нецелесообразным
В моем приложении дерево состояний имеет такую форму:
{
...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'
})
})
}