2016-09-22 8 views
2

私の州は私のreduxストアのImmutable.js型であり、私は自分の還元人の州だけを変更します。不変を使用してスキップし、コマンドで私のアプリケーションをチェックするパーサを持って、減速機の機能の外で私の店を変更する場合、警告するのは意味がありませんか?あるいは、なぜこれが行われていないのかという正当な理由はありますか?還元のための不変状態の必要性

+0

の場合immutable.jsに依存したくない場合は、[deep-freeze](https://www.npmjs.com/package/deep-freeze)と[Object.assign()](https:// developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)をレデューサーに追加します。問題は、フリーズされたオブジェクトを更新するのは面倒なことです。特にObject.assign({}、freezedObj、{a:1、b:Object.assign({}、freezedObj.b、{c:2})などの入れ子オブジェクトの場合は特にそうです。 });単純に割り当てを超えることができる軽量不変ヘルパーである[ImmutableAssign](https://github.com/engineforce/ImmutableAssign)をチェックアウトすることができます。 – engineforce

答えて

3

あなたが好きなら、あなたのレデューサーの状態を突然変異させることができます。 Reduxは、あなたがあなたの状態を突然変異させないように義務付けていませんが、それに対してそれをアドバイスします。

ReduxではないReact-Reduxは、状態が決して変化しないという前提で設計されています。これにより、状態階層内のどこかで何かが変更されたかどうかを調べるための非常に高速なチェックを行うことができます。

Redux自体は、アクションが処理されるたびに、(状態の変更または置換によって)イベントを発生させるかどうかを指定します。 undefined以外の状態をチェックすることはありません。あなたがそれで何をするかは気にしません。

不変状態には多くの利点がありますが、Reduxで使用されている主な変更点は速いことです。例えば、あなたの "パーサー"は、意味のある決定を下すために実行されるたびに、すべてのオブジェクトと配列のすべてのプロパティとアイテムをあなたの州全体で訪問する必要があります。 React-Reduxが同じことをしたら、それはひどく遅くなり、誰もそれを使用しませんでした。

したがって、数千の開発者は、学者を超えて本当の利点があるため、自分自身を不変性に制限しています。

1

この質問へのカップルの側面があります:

  • Reduxのは、あなたの減速のための純粋な関数を記述することができ奨励しています。これにより、タイムトラベルデバッグなどの機能が有効になり、テスト可能になります。 「純粋な」とは、副作用がないことを意味します。つまり、渡されたデータを直接変更しないでください。代わりに、データの更新を不変に行う必要があります(更新するデータの一部をコピーする)。
  • React -Reduxのconnect関数は、更新が不変に行われることを前提とし、受信データが変更されたかどうかを参照する比較を行います。オブジェクト参照が以前と同じである場合は、何も変更されていないものとみなし、コンポーネントの再レンダリングは行いません。

しかし、「不変のアップデート」ないあなたはImmutable.jsライブラリを使用する必要が意味ないことに注意してください。プレーンなJSオブジェクトを不変の形で更新することは完全に可能です。

私はReact/Redux links listの一部として、これらのトピックに関する有用な記事への多数のリンクを持っています。特に、Immutable Data ManagementFunctional Programmingのカテゴリを参照してください。また、別のページにはimmutable data-related librariesのさまざまなものがあります。これには、プレーンなJSデータの更新を容易にするユーティリティが含まれています。最後に、誤って自分の状態に変化があった場合に警告するツールを含め、Redux-related dev toolsという番号のリストがあります。

2

私は、不注意な状態の突然変異をチェックできるミドルウェアのタイプは、実際には本当にクールなアイデアだと思います。私はそれがいかに実現可能か/実行可能か(それは既に存在しているかもしれませんし、私はそれについて聞いたことがないのかどうかはわかりません)。しかし、Immutable.jsやseamless-immutableのようないくつかのタイプのライブラリを使用していない人にとっては、それがどのように役立つかがわかります。

私は不変であることを明確にしたいと思います。あなたがあなたの州に変化を起こしていないことを強制しています。そして、それはあなたの状態をあなたの減量者の外から変えることが不可能になったということです。不変性の一般的なプログラミングの概念と、状態を変更するために減速機を使用するRedux固有のコンセプトとの間に重要な違いがあります。 Immutable.jsは前者を強制し、論理的に後者を強制します。

  • パフォーマンス

    しかし、Immutable.jsが誤って状態を変異することはできません保証しているという事実は、あなたの再来店のためのライブラリを使用するための唯一の理由ではないImmutable.jsは、パフォーマンスの最適化を持っていますこれは、フード内のメモリ内の同じ基本オブジェクトを実際に共有しながら、不変性を強制することを可能にします。つまり、アレイ内の1つの項目を変更するだけで大​​量のデータを完全にコピーすることはできません。これは、ストアに大量のデータや状態の変化が多い状況では、メモリフットプリントが大幅に少なくなることを意味します。

  • ヘルパーのメソッドですが、状態を変更するのを防ぐためにさまざまな手法を使用していますが、Immutable.jsには本当にいいAPI​​があります。たとえば、配列やオブジェクトに深くネストされたものを変更しようとすると、であり、ネイティブJSで極端にであることがわかります。 Immutable.jsを使用すると、必要な深さまでドリルダウンして何かを変更し、これらをまとめて連鎖させることができます。

    return state 
     .updateIn(['todos', '5', 'attachment'], attachment => attachment.set('name', 'foo')) 
     .set('isProcessing', true) 
     .updateIn(['other', 'nested', 'stuff'], stuff => stuff.set('bar', 'baz')); 

言われて、それは間違いなく、オプションだということ。あなたは上記のシームレス-不変、lodash-FPのような選択肢を持って、ちょうどそのように手動でそれをやってきました:

return Object.assign({}, state, { name: 'new name' }); 

比較のために、Immutable.jsの代替だけで次のようになります。

return state.set('name', 'new name'); 
関連する問題