Я пытаюсь обмотать голову, как изменить глубоко вложенное состояние в redux. Мне разумно комбинировать редукторы и менять свойства первого уровня состояния для этих предметов. Там, где я не совсем ясно, как изменить состояние глубоко вложенного имущества. Давайте притворимся, что у меня есть приложение для корзины покупок. Ниже мое состояние:Редукторы Redux - изменение глубоко вложенного состояния
{
cart: {
items: []
},
account: {
amountLeft: 100,
discounts: {
redeemed: [],
coupons: {
buyOneGetOne: false
}
}
}
}
Когда пользователь вводит в коде, скажем, они могут выкупить «buyOneGetOne» купон, и это значение должно стать правдой. У меня есть редуктор для тележки, а другой для счета. Для свойства первого уровня (например, если я убирала предметы телеге в), я бы просто сделать следующее в моем редукторе:
case 'EMPTY_CART':
return Object.assign({}, state, {items: []});
Для изменения buyOneGetOne, однако, кажется, что я бы сначала нужно сделать Object.assign на купонах (потому что buyOneGetOne был изменен), а затем сделал Object.assign на скидках (потому что я изменил купоны), а затем, наконец, испустил действие, чтобы редуктор мог сделать Object.assign на учетной записи (поскольку сейчас скидки изменено). Это кажется действительно сложным и легким для того, чтобы сделать что-то неправильное, и это заставляет меня думать, что должен быть лучший способ.
Я все об этом не так? Кажется, что редукторы используются только для изменения свойств корневого уровня состояния (например, для корзины и учетной записи) и что у меня не должно быть редуктора, который затрагивает состояние внутри учетной записи (например, редуктор скидок), потому что учетная запись уже имеет редуктор , Но когда я хочу изменить одно свойство далеко по дереву состояний, становится сложно объединить каждый объект из этого изменения вплоть до цепочки объектов к дочернему элементу корня ...
Можете ли вы/должны ли вы есть редукторы внутри редукторов, как в этом случае есть скидки?
Черт, побей меня на несколько секунд - отличный ответ! – mxstbr
На самом деле вы можете использовать 'combReducers()' более одного раза в своем приложении. Я рекомендую вам просмотреть пример [shopping-cart] (https://github.com/reactjs/redux/tree/master/examples/shopping-cart/reducers) в репозитории Redux, который демонстрирует различные модели редукторной композиции. –
Это круто, я этого не понимал. Однако не цель также иметь как ровное дерево состояния, насколько это возможно? Где баланс между вложенными редукторами и деревом с плоским деревом? – Skitterm