2017-02-16 17 views
0

storeにはgetStateというメソッドがあり、ストアの現在の状態が返されます。コードがストア状態を変更できないのはなぜですか?

私のアプリケーションのどこかのコードが、(偶然に)返されたstatestoreから変更しないようにするにはどうすればよいですか?

のは、私がこれを呼び出すとしましょう:私はstoreオブジェクトにgetStateに見つけた

let state = store.getState(); 
state.someProperty = 'fun'; 

実装は単にそれぞれの新しいアクションで上書きされます内部状態オブジェクトを返します。

const getState =() => state; 

アクション/新しい状態の間で、コードが他のサブスクライバによって読み取られる状態を変更できないのはなぜですか?上記の例では、someProperty'fun'に設定すると、stateプロパティのstoreの内部に上書きされます。

私は明らかに状態を変更するはずはありませんが、簡単な間違いは、(意図的に)入力を変更するコンポーネントに状態をバインドする可能性があります。

<app-some-component [user]="state"></app-some-component> 

そのstateモデルのクローンとして実装されていないgetState()べきか?

P.S.これはAngularとは特に関係していません。なぜなら、Angularに使われていない人が多いため、質問に答えることができるようにするためです。

答えて

1

答えはありません: :)

コアReduxのライブラリ状態が変異したかを取得します場合は、それ自体は技術的には、実際に気にしません。あなたは実際にあなたのレデューサーで突然変異を起こすことができますか、またはあなたのアプリの他の部分に状態ツリーが得られ、それを突然変異させることができます。

しかし、突然変異はタイムトラベルのデバッグを破るだけでなく、テストを信頼できないものにします。さらに重要なのは、React-Reduxライブラリでは、が状態を不変に処理し、状態が変更されたかどうかを確認するために浅い等価比較に依存していることを前提としています。 (これは"Why isn't my component re-rendering?"がRedux FAQにある理由です。99.9%の時間、偶発的な突然変異によるものです)

突然変異が懸念される場合は、プレーンなJSの代わりにImmutable.jsのようなライブラリを使用できますオブジェクトを使用するか、freezing your state in development to catch mutationsのいくつかのツールの1つを使用します。

+0

immutable(immutable.jsなど)のモデルを持っている必要があるか、テスト/開発時に私の状態をフリーズする必要がありますが、プロダクションでフリーズする必要はありません。 –

+0

私が言ったように、Redux自体には、不変のものは何もありません。レデューサーコードを慎重に書いたり、不変の更新ユーティリティーlibを使用していても、技術的にはコードのどの部分も 'getState'を呼び出して内容を変更することができます。それが起こらないことを保証したい場合は、プレーンなJSオブジェクト以外のものを使用するか、プレーンなオブジェクトをフリーズさせて、コードがどこにも変化しないようにする必要があります。つまり、アプリケーションの残りの部分は、どこでも状態を変更する必要はありませんが、間違っていることがあります。 – markerikson

+0

これは悪いと思うのを助けることはできません - 事故になりやすい - 自動テストがこれまで以上に重要になるでしょう... –

関連する問題