2016-12-29 7 views
0

私のAPIからデータを受け取り、それをreduderにダンプする前にnormalizrに渡しています。 APIから人々のデータを取得するとき、減速機はそれらを人物ストアに追加する必要があります。現在、私のレデューサーは店舗内の既存のデータをすべて上書きしています。結合する代わりに新しいオブジェクトの要素を上書きして広げる

減速:減速機は、一度使用された後

export default function reducer(state={ 
    people: { 
     entities : { 
      people: { 
      0 : { 
       name : '' 
      } 
      } 
     }, 
     result : [0,] 
    } 
    }, action) { 
    switch (action.type) { 
    case "GET_PEOPLE": { 
     const newpPeople = {...state.people, ...action.payload }; 
     console.log(state.people) 
     console.log(action.payload) 
     console.log(newpPeople) 
     return {...state, people : newpPeople}; 
    } 
    default : 
     return state 
    } 
} 

この最初のコンソールログは状態です。第三コンソールログ次に

{ 
    entities: { 
       people : { 
          7 : { id: 7, name: "sally" }, 
          8 : { id: 8, name: "ana" } 
         } 
       }, 
    result : [ 7, 8 ] 
} 

:第2コンソールログが追加される新しい人々のペイロードになります

{ 
    entities: { 
       people : { 
          1 : { id: 1, name: "jim" }, 
          2 : { id: 2, name: "billy" } 
         } 
       }, 
    result : [ 1, 2 ] 
} 

:それは私が店に保存した人の最初のセットを持っています2つの状態を組み合わせる必要がありますか?しかし、それはちょうどサリーとアナとの最後のものを繰り返し、他のすべてを上書きします。

+0

を。 – sandyJoshi

+0

詳細については、このコードを確認してください。https://github.com/sandyjoshi/react-redux-hello-meetup/blob/master/src/utils/index.js&https://github.com/sandyjoshi/react-redux -hello-meetup/blob/master/src/reducers/wish.js – sandyJoshi

+0

あなたは精巧にできますか?デフォルト状態は、ストアの初期化時にのみ使用されます。私がアクションをディスパッチすると、ペイロードは私のコンソールログのコードでそのデフォルトコードを上書きするので、デフォルトコードは最初にしかありません – DigitalDisaster

答えて

1

拡散はオブジェクトを再帰的に結合しないためです。

それはあなたが期待どおりに動作この簡単な例を見てみましょう:あなたの状態はあなたがその関数の引数として渡されているデフォルト値から来ているので

const state = { 
    entities: { 
       people : { 
          1 : { id: 1, name: "jim" }, 
          2 : { id: 2, name: "billy" } 
         } 
       }, 
    result : [ 1, 2 ] 
} 

const payload = { 
    entities: { 
       people : { 
          7 : { id: 7, name: "sally" }, 
          8 : { id: 8, name: "ana" } 
         } 
       }, 
    result : [ 7, 8 ] 
} 

const new_state = { 
    entities: { 
       people : { 
          ...state.entities.people,...payload.entities.people 
         } 
       }, 
    result : [...state.result,...payload.result] 
} 

console.log(new_state) 
+0

これは正しい軌道に乗ってきており、私は前進しています。それは本当に最善のアプローチですか?これをよりうまく処理できるツールはありますか?人々の鍵は唯一の存在ではありません。私が他のエンティティを追加すると、処理するのがはるかに複雑になります。 – DigitalDisaster

+0

各レデューサーは、状態のスライス、変更が必要なスライスを受け取るレジューサーコンポジションを使用できます。公式の文書には良い例がありますhttp://redux.js.org/docs/basics/Reducers.html –

+0

私はあなたに正しいものとして印を付けるつもりです。答えは、すべてのサブオブジェクトを広げていく必要があるということです。私が変更する必要があったのは、lodash.uniqを使用して結果をラップすることだけです。重複したキー値があることがあるためです。どうもありがとうございました。私は前進することができます。 – DigitalDisaster

関連する問題