レビュックスで深くネストされた状態を変更する方法について、私は頭を抱えています。レデューサーを組み合わせて、これらの部分の状態の第1レベルのプロパティを変更することは意味があります。私があまり明確でないところでは、深く入れ子になった財産の状態を変える方法があります。 私はショッピングカートアプリを持っているとしましょう。以下は私の状態です:Reduxレデューサー - 深入れネスト状態の変更
{
cart: {
items: []
},
account: {
amountLeft: 100,
discounts: {
redeemed: [],
coupons: {
buyOneGetOne: false
}
}
}
}
ユーザーがコードに入ると、のは、彼らが「buyOneGetOne」クーポンを可能としましょう、その値がtrueになる必要があります。 私はカートのための減速機を持っていて、アカウントのために別のものを持っています。最初のレベルのプロパティ(のような私は、カートの項目をクリアした場合)のために、私はちょうど私の減速で次の操作を行います:
case 'EMPTY_CART':
return Object.assign({}, state, {items: []});
buyOneGetOneを変更するために、しかし、私が最初に実行する必要がありますように思えます(クーポンを変更したので)割引でObject.assignを行い、最後にレデューサーがObject.assignを行うことができるようにアクションを実行します(ディスカウントは今ではかわった)。これは本当に複雑で間違っているように思えますが、それはよりよい方法が必要であると信じさせてくれます。
私はこれについてすべて間違っていますか?レデューサーは州のルートレベルのプロパティ(カートやアカウントなど)を変更するためにのみ使用され、アカウントには減速機があるため、アカウント内の状態に触れるレデューサー(割引レデューサーなど)を使用しないでください。しかし、私はステートツリーの1つのプロパティを遠くに変更したいときは、すべてのオブジェクトをそのオブジェクトチェーンからルートの子にまでマージするのが複雑になります。
この場合のようにレデューサーの内部にレデューサーを持っていますか?
くそ、数秒で私を打つ - 素晴らしい答え! – mxstbr
実際、あなたのアプリで 'combineReducers()'を複数回使うことができます。還元剤組成の異なるパターンを示すReduxレポの[shopping-cart](https://github.com/reactjs/redux/tree/master/examples/shopping-cart/reducers)の例をチェックすることをお勧めします。 –
それは素晴らしいです、私はそれを認識しませんでした。しかし、可能な限り状態ツリーをフラットにすることも目標ではありませんか?ネストされた減速機とフラットな状態のツリーのバランスはどこですか? – Skitterm