Sto cercando di capire come modificare lo stato di nidificazione profonda in redux. Per me ha senso unire i riduttori e cambiare le proprietà di primo livello dello stato per quei pezzi. Dove non sono così chiaro è su come cambiare lo stato di una proprietà profondamente annidata. Facciamo finta di avere un'app del carrello. Qui di seguito è il mio stato:Riduttori redux: modifica dello stato profondamente annidato
{
cart: {
items: []
},
account: {
amountLeft: 100,
discounts: {
redeemed: [],
coupons: {
buyOneGetOne: false
}
}
}
}
Quando un utente inserisce un codice, diciamo che possono riscattare il coupon "buyOneGetOne" e che valore dovrebbe diventare realtà. Ho un riduttore per il carrello e un altro per conto. Per una proprietà di primo livello (come se stavo Cancellazione degli elementi del carrello), vorrei solo fare quanto segue nel mio riduttore:
case 'EMPTY_CART':
return Object.assign({}, state, {items: []});
Per cambiare buyOneGetOne, tuttavia, sembra che io desidero innanzitutto bisogno di fare una Object.assign sui tagliandi (perché buyOneGetOne è stato modificato), quindi facendo un Object.assign sugli sconti (perché avevo tagliandi modificati), e infine emettendo l'azione in modo che il riduttore potesse fare Object.assign sull'account (perché gli sconti ora hanno cambiato). Questo sembra davvero complicato e facile da fare male, però, il che mi porta a credere che ci debba essere un modo migliore.
Sto andando in giro tutto sbagliato? Sembra che i riduttori siano utilizzati solo per modificare le proprietà del livello radice dello stato (come carrello e account) e che non debba avere un riduttore che tocchi stato all'interno dell'account (come un riduttore di sconti), perché l'account ha già un riduttore . Ma quando voglio solo cambiare una proprietà molto in basso nell'albero dello stato, diventa complesso unire ogni oggetto da quel cambiamento lungo tutta la catena degli oggetti al figlio della radice ...
Puoi/dovresti avere riduttori all'interno di riduttori, come in questo caso avere un riduttore di sconti?
Dannazione, battimi di pochi secondi - ottima risposta però! – mxstbr
Infatti, puoi usare 'combinaReduttori()' più volte nella tua app. Vi consiglio di controllare l'esempio [shopping-cart] (https://github.com/reactjs/redux/tree/master/examples/shopping-cart/reducers) nel repository Redux che dimostra diversi modelli di composizione del riduttore. –
È bello, non me ne sono reso conto. Tuttavia, l'obiettivo non è quello di avere un albero di stato il più possibile piatto? Dov'è l'equilibrio tra i riduttori annidati e un albero di stato piatto? – Skitterm