У меня есть магазин, который имеет такую форму:
{
// ...data
user: {
warranties: {
W_1: ['O_1', 'O_2'],
W_2: ['O_3', 'O_4']
}
}
}
Где ключи, начинающиеся с W_
, являются гарантиями, ключи, начинающиеся с O_
, являются вариантами.
Для каждого гарантия У меня есть один или несколько вариантов , связанных с ним, отношения в user.warranties
имеют вид: warranty => [options]
.
Для достижения этого я объединяю своиредукторы, подобные этому:
rootReducer = combineReducers({
// ...other main reducers
user: combineReducers({
// ...other user reducers
warranties
})
})
Теперь " проблема " заключается в том, что действия USER_WARRANTY
и USER_OPTION
обрабатываются одним и тем же редуктором, потому что:
Когда я добавляю опцию, мне нужно нажать ее для правильного ввода гарантии.
Обратно, когда я добавляю гарантию, мне нужно заполнить еес параметрами по умолчанию.
И, в конечном итоге, они работают с одним и тем же фрагментом данных
Таким образом, редуктор warranties
должен реагироватьдля обоих действий, выглядящих следующим образом:
export default function warranties(state = {}, action) {
switch (action.type) {
case USER_WARRANTIES_ADD:
// add warranty key to `user.warranties`
case USER_WARRANTIES_REMOVE:
// remove warranty key from `user.warranties`
case USER_OPTIONS_ADD:
// push option to `user.warranties[warrantyID]`
case USER_OPTIONS_REMOVE:
// remove option from `user.warranties[warrantyID]`
default:
return state
}
}
Я хотел бы разделить это на два редуктора, warranties
и options
, но все же заставить их работать на том жекусок данных.
В идеале я бы тогда сочинил свой корневой редуктор следующим образом:
rootReducer = combineReducers({
// ...other main reducers
user: combineReducers({
// ...other user reducers
warranties: magicalCombine({
warranties,
options
})
})
})
Где magicalCombine
- это функция, которую я не могу найти.
Я пытался reduce-reducers
, но похоже, что второй редуктор (options
) фактически никогда не достигается, и я на самом деле не уверен в этом, так как я не пытаюсь достичь плоского состояния, но на самом деле работают с тем же ключом.