2016-09-15 8 views
1

私が読んだところでは、reduxはObject.assignまたはスプレッド演算子を使用してデータのシャローコピーを作成しますが、それはどのように意味がありますか?私は、データが店舗外で変更された場合でも店舗の内容を変更しないように、データの完全なコピーを作成することがポイントだと思っていました。それが浅いコピーであれば、データがリンクされ、ディスパッチがなくてもストア内のデータを変更する問題が発生します。なぜreduxは変更のたびにデータのコピーを作成する必要がありますか?

以下の例では、action.dataが浅くコピーされた場合、そのデータがどこから来たのか変更された場合、ディスパッチ権がなくてもストア内の内容が変更されますか?

const activePokemon = (state = {}, action) => { 
    switch (action.type) { 
    case 'ADD_ACTIVE_POKEMON': 
     return { 
     ...state, 
     ...action.data 
     } 
    default: 
     return state 
    } 
} 
+0

私はこのページをチェックします! https://facebook.github.io/react/docs/advanced-performance.htmlこれは不変性と、反応がDOMのコピーとどのように反応するかについて語っています。 – jacoballenwood

答えて

1

あなたがreduxThree Principlesを以下している場合は、店の外の変更を心配しないであろう。

状態を変更する唯一の方法は、発生したことを説明するオブジェクトactionを発行することです。

店外の変更が状態を変更することを意図している場合は、代わりにdispatchを使用してください。状態の更新に加えて、dispatchは、店舗のすべての加入者に変更について通知します。

そして状態にいくつかのデータを「結合」あなたは、データは、それが状態の一部であるため、変更すべきではない、と。..

状態が

読み取り専用になったら

編集:reducersのドキュメントでコピー

を作りについて(詳細については、もう一度それを読んで!)、reduxのみpure 滞在に私たちの減速が必要です3210。新しい状態が異なる場合、レデューサーは新しいオブジェクトを作成しなければならず、コピーを作成することは変更されていない部分を記述する方法です。

新しい状態を記述するためにコピーを作成しているとは限りません。 return {}は、私たちが代わりにコピーの変わらないプロパティを指定することができ、維持するための唯一のいくつかのプロパティがある場合、すべての状態のプロパティをクリアするために使用することができます。

return { 
    unchangedProp0: state.unchangedProp0, 
    unchangedProp1: state.unchangedProp1, 
    ...newData 
} 
+0

私の質問です。状態は読み取り専用ですが、基本的には更新していますオリジナルのコピーを更新してレデューサーに表示します。なぜ私たちはそれをしなくてはなりませんか?すべてを新しいデータで置き換えるだけで、なぜコピーを作成する必要がありますか? – stackjlei

+1

その答えを延長しました – DarkKnight

関連する問題