2017-08-03 13 views
0

ではありません。アクションを派遣した後)はマップを取得Reduxの減速を(反応し、私はこのようなネストされた/かなり複雑Reduxの店舗持っている機能

{ 
    object1 
    { 
    array: 
    [ 
     object[1]: { 
     id: 1, 
     replace: "" 
     } 
     object[2]: { 
     id: 2 
     replace: "" 
     } 
     object[3]: { 
     id: 3, 
     replace: "" 
     } 
    ] 
    } 
} 

を、私はアクションを挿入する必要がありますIDに基づいてオブジェクト[]の1つに追加します。私は現在、以下のスクリプトを使用してを置き換えます。をレデューサー内に置き換えてください。しかし、これは、のオブジェクト2の{}の中かっこのために配列をオブジェクトに変更します。

case UPDATE: 
    return { 
    ...state, 
    object1: { 
     ...state.object1, 
     array: { 
     ...state.object1.array, 
     [action.id]: { 
      ...state.object1.array[action.id], 
      replace: action.result 
     } 
     } 
    } 
    }; 

object2.mapはオブジェクトに変更しても機能しなくなったので、その後はレンダリングが中断します。オブジェクトに変換せずにこれを回避するにはどうすればよいですか?

以下は、構文エラーで失敗しましたでしょう:

case UPDATE: 
    return { 
    ...state, 
    object1: { 
     ...state.object1, 
     array: [ 
     ...state.object1.array, 
     [action.id]: { 
      ...state.object1.array[action.id], 
      replace: action.result 
     } 
     ] 
    } 
    }; 
+0

Array [1]、Array [2]、Array [3] –

+0

またはobject2内の3つのオブジェクトを言うことを意味しますか? –

+0

@ShubhamKhatriうん、私の間違い。上記の質問を変更しました –

答えて

1

あなたは、直接あなたが広がり構文で変更したいインデックスを指定することはできません、あなたは最初のインデックスを検索し、

case UPDATE: 
    var idx = state.object1.object2.findIndex(obj => obj.id === action.id) 
    return { 
    ...state, 
    object1: { 
     ...state.object1, 
     object2: [ 
     ...state.object1.object2.slice(0, idx), 
     { 
      ...state.object1.object2[idx], 
      replace: action.result 
     } 
     ...state.object1.object2.slice(idx + 1) 
     ] 
    } 
    }; 
ようにそれを行う必要があります

そうでなければ、不変性ヘルパーパッケージを利用することができます。不変性ヘルパーパッケージを使用するためのコードに続いて、それ

how to use Immutability helper to update a nested object within an array?

+0

この回答を確認してください –

+0

ありがとう!より良いパフォーマンスを提供するため、代わりに不変性ヘルパーを使用しました。コードの下で更新されました。 –

+0

問題ありません。しかし、それはすでに私の答えで追加した質問への答えとして既にある –

0

を行う方法のサンプルについては、この答えを参照してください。

case UPDATE: 
    return update(state, { 
    object1: { 
     array: { 
     [action.id]: { 
      replace: { 
      $set: action.result 
      }, 
     }, 
     }, 
    } 
    }); 
1

'ライブラリimmutadotを確認できます。その目的は、複雑なネストされたデータ構造を非常に簡潔な方法で更新するのを手助けすることです。

あなたのケースでは、あなたはそれをこのように書くことができます。

import { set } from 'immutadot' 

... 

    case UPDATE: 
    return set(state, 'object1.arrary[' + id + '].replace', action.result) 
    // or with templated string 
    return set(state, `object1.arrary[${ id }].replace`, action.result) 

... 

あなたはlodashの機能の全学部を使用することができますので、それは木の下lodashに依存しています。

+1

これはきれいに見える! –

+0

それは:-)です。唯一の欠点は、flowやtypescriptのような型システムでそれを使用しようとするときです。あなたは即座にタイプを失う... –

関連する問題