私の州は私のreduxストアのImmutable.js型であり、私は自分の還元人の州だけを変更します。不変を使用してスキップし、コマンドで私のアプリケーションをチェックするパーサを持って、減速機の機能の外で私の店を変更する場合、警告するのは意味がありませんか?あるいは、なぜこれが行われていないのかという正当な理由はありますか?還元のための不変状態の必要性
答えて
あなたが好きなら、あなたのレデューサーの状態を突然変異させることができます。 Reduxは、あなたがあなたの状態を突然変異させないように義務付けていませんが、それに対してそれをアドバイスします。
ReduxではないReact-Reduxは、状態が決して変化しないという前提で設計されています。これにより、状態階層内のどこかで何かが変更されたかどうかを調べるための非常に高速なチェックを行うことができます。
Redux自体は、アクションが処理されるたびに、(状態の変更または置換によって)イベントを発生させるかどうかを指定します。 undefined
以外の状態をチェックすることはありません。あなたがそれで何をするかは気にしません。
不変状態には多くの利点がありますが、Reduxで使用されている主な変更点は速いことです。例えば、あなたの "パーサー"は、意味のある決定を下すために実行されるたびに、すべてのオブジェクトと配列のすべてのプロパティとアイテムをあなたの州全体で訪問する必要があります。 React-Reduxが同じことをしたら、それはひどく遅くなり、誰もそれを使用しませんでした。
したがって、数千の開発者は、学者を超えて本当の利点があるため、自分自身を不変性に制限しています。
この質問へのカップルの側面があります:
- Reduxのは、あなたの減速のための純粋な関数を記述することができ奨励しています。これにより、タイムトラベルデバッグなどの機能が有効になり、テスト可能になります。 「純粋な」とは、副作用がないことを意味します。つまり、渡されたデータを直接変更しないでください。代わりに、データの更新を不変に行う必要があります(更新するデータの一部をコピーする)。
- React -Reduxの
connect
関数は、更新が不変に行われることを前提とし、受信データが変更されたかどうかを参照する比較を行います。オブジェクト参照が以前と同じである場合は、何も変更されていないものとみなし、コンポーネントの再レンダリングは行いません。
しかし、「不変のアップデート」ないあなたはImmutable.jsライブラリを使用する必要が意味ないことに注意してください。プレーンなJSオブジェクトを不変の形で更新することは完全に可能です。
私はReact/Redux links listの一部として、これらのトピックに関する有用な記事への多数のリンクを持っています。特に、Immutable Data ManagementとFunctional Programmingのカテゴリを参照してください。また、別のページにはimmutable data-related librariesのさまざまなものがあります。これには、プレーンなJSデータの更新を容易にするユーティリティが含まれています。最後に、誤って自分の状態に変化があった場合に警告するツールを含め、Redux-related dev toolsという番号のリストがあります。
私は、不注意な状態の突然変異をチェックできるミドルウェアのタイプは、実際には本当にクールなアイデアだと思います。私はそれがいかに実現可能か/実行可能か(それは既に存在しているかもしれませんし、私はそれについて聞いたことがないのかどうかはわかりません)。しかし、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');
- 1. マイナーアクションのための還元状態
- 2. コードからの還元された還元状態の保存状態
- 3. 還元還元剤で他の還元剤の状態を取得する
- 4. 還元剤の状態は空です
- 5. 還元状態ツリーの設計
- 6. 還元状態でのクリア状態アクションのディスパッチ
- 7. チェックボックスの状態は還元状態に基づいて変化しません
- 8. 還元状態変更後のDOM操作の処理
- 9. この還元剤の状態を変えていますか?
- 10. 還元状態のビュー機能を含める
- 11. componentWillReceiveProps状態が還元状態更新後のレンダリング状態と異なる
- 12. 還元状態がそれが
- 13. window.scrollで還元状態を取得
- 14. オブジェクトに還元状態をバインドする
- 15. 還元状態の変更時に要素を削除します
- 16. meteor.js:還元とセッション変数と反応状態
- 17. コンポーネントの還元状態WillRecievePropsのフォワードバックボタンでの問題
- 18. APIからの還元/状態更新前のコンポーネントのレンダリング
- 19. 還元還元剤に含まれる反応還元反応には、状態が含まれています
- 20. ネストされた還元状態から要素を削除します
- 21. 還元状態ツリーの項目が重複しています
- 22. 個々の状態項目に対する反復還元プロパティー
- 23. 還元状態のjsonを保存する
- 24. 入力と反応の還元状態を更新
- 25. 反応還元の状態について
- 26. 還元状態をクリアする最良の方法
- 27. 還元/反応しているアプリの状態に還元剤の名前のプロパティがあります
- 28. 還元状態で状態が変化した場合、反応は再描画できません
- 29. 還元状態が別の状態を変更する理由を教えてください。
- 30. reactjsプレゼンテーションcomopnentは還元状態の変更で再レンダリングされません
の場合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