2016-03-19 8 views
1

Object.assign - ここ& Reduxの反応し使用した更新特定のプロパティ

マイStateがこれに似たものになりますについては

const tabsState = (state = initialTabState, action) => { 
    switch(action.type) { 
    case(ENABLE_TAB): 
     return (
      Object.assign({}, state, action.payload) 
     ); 
    default: 
     return state; 
    } 
}; 

State : { 
    First : { 
     prop1 : "a", 
     prop2 : "b" 
    }, 
    ... 
    Last : { 
     prop1 : "c", 
     prop2 : "d" 
    } 
} 

をマイReducer関数は次のようになりますaction.payload、私はprop1の新しい値を含むデータを送信したいだけです。 Object.assignの私の理解は、sourcesのパラメータは、小道具を更新するだけです、彼らは状態でオブジェクトを上書きしない、それは正しいですか?上記で

、私のaction.payloadは、次のようになります。

First : { 
     prop1 : "z" 
    }, 
    Second : { 
     prop2 : "x" 
    }, 
    ... 

それは、Stateオブジェクト内First &以降のオブジェクトを上書きしているようです。つまり、Reducerによって返された新しい州には、各オブジェクトの2番目の小道具がありません。 prop2s

+0

は、何か他のものにあなたのデータ構造を変更することを検討してください。たとえば、[この回答](http://stackoverflow.com/a/32921731/1297743)を参照してください。また、減速機を分割して、「第1」、「第2」などの特殊減速機を作成することもできます。 –

答えて

1

私はあなたがImmutable.jsを使用できると思うだろう。私はreduxを扱い、州の木に突然変異を起こさないことに非常に役立つことを発見しました。具体的なケースについては、演算子Map.mergeDeep()が必要です。ここで、Mapはあなたの不変のデータ構造です。 MergeDeepは、Object.assignと思っているように行動します。

{ 
    state: { 
    meta: { 
     data: { 
     foo: 'bar', 
     }, 
    }, 
    }, 
} 

そして、あなたはそれが次のようになりたい::

{ 
    state: { 
    meta: { 
     data: { 
     foo: 'bar', 
     hello: 'world', 
     }, 
    }, 
    }, 
} 

まず、作成あなたの場合

import { fromJS } from 'immutable'; 
const initialTabState = fromJS({ 
    { 
     First : { 
     prop1 : "a", 
     prop2 : "b" 
     }, 
    ... 
     Last : { 
     prop1 : "c", 
     prop2 : "d" 
     } 
    } 
}) 
const tabsState = (state = initialTabState, action) => { 
    switch(action.type) { 
    case(ENABLE_TAB): 
     return (
      state.mergeDeep(fromJS(action.payload)) 
     ); 
    default: 
     return state; 
    } 
}; 
+0

ありがとうございます、私は今、不変を採用しています。 – Kayote

+0

ニース!私は本当にそれを使用して楽しむ!私はそれが私を明白に保つと感じます。 – natac

0

このようなオブジェクトツリーをマージするには、ディープアサインを使用する必要があります。

https://github.com/sindresorhus/deep-assign

+0

Davidに知らせてくれてありがとう、Object.assignの深いマージもあるという印象を受けました。 – Kayote

1

のは、あなたがこのように見える状態を持っていると言うためにそう あなたが取得したいネストされたプロパティを更新する関数:

const update = (data, obj) => { 
    return Object.assign(
    {}, 
    data, 
    obj, 
) 
} 

そして、このようなupdate機能することを呼び出す:あなたは深い更新状態に問題がある場合は

return Object.assign(
    {}, 
    state, 
    { 
    meta: { 
     data: update(state.meta.data, {hello: 'world'}), 
    }, 
    }, 
) 
関連する問題