Я пытаюсь обвести голову, как изменить глубоко вложенное состояние в 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 на счету (поскольку скидка теперь изменилась). Это кажется действительно сложным и легким для того, чтобы сделать что-то неправильное, но это заставляет меня думать, что должен быть лучший способ.
Неужели я все это делаю неправильно? Кажется, что редукторы используются только для изменения свойств корневого уровня состояния (например, для корзины и учетной записи) и что у меня не должно быть редуктора, который затрагивает состояние внутри учетной записи (например, редуктор скидок), потому что учетная запись уже имеет редуктор, Но когда я хочу изменить одно свойство далеко вниз по дереву состояний, он становится сложным, чтобы объединить каждый объект из этого изменения вплоть до цепочки объектов к дочернему элементу корня...
Можете ли вы/должны иметь редукторы внутри редукторов, например, в этом случае есть скидки?