あなたの質問は主に意見に基づいていますが、ngrx が適切な選択である理由をいくつか説明できます。アプリケーションのすべての状態を 1 つのオブジェクト (Single State Tree) に格納するのは得策ではないと言う人もいますが、ただし、私の意見では、あなたの状態は関係なく存在します。ストアを使用すると、すべてが一度にまとめられ、変更は明示的で追跡されますが、全体に散らばり、コンポーネントによってローカルに維持されます。さらに、アプリケーション内のストアから特定のプロパティを選択するため、関心のあるデータのみを選択できます。たとえば、常に配列を返し、Observables を使用することでレデューサーの不変性を受け入れる場合は、 ChangeDetectionStrategy を利用できますOnPush
。OnPush
パフォーマンスを大幅に向上させます。Angular の公式ドキュメントから抜粋した次の図を見てみましょう。
ご覧のとおり、Angular アプリはコンポーネント アーキテクチャを使用して構築され、コンポーネント ツリーが作成されます。OnPush
コンポーネントの on は、入力属性が変更された場合にのみ変更検出が開始されることを意味します。たとえば、Child B
isOnPush
とChild A
isの内部でDefault
何かを変更した場合、入力属性が変更されていないため、変更検出器はトリガーされません。ただし、内部で何かを変更すると、デフォルトの変更検出機能があるため、再レンダリングされます。Child A
Child B
Child B
Child A
パフォーマンスと単一の状態ツリーについては以上です。ストアのもう 1 つの利点は、コードと状態の変更について実際に推論できることです。したがって、ほとんどの Angular 1.x アプリの現実はスコープ スープです。これは、 Lukas Ruebbelke によるブログ投稿からの素晴らしいグラフィックです。
写真はそれがかなり良いことを示しています。Tero Parviainenの別の記事ng-controller
では、 . それはすべてスコープ スープに関連しており、常に変化する状態を管理することは困難です。redux
動機は次のように述べていますここを参照してください:
モデルが別のモデルを更新できる場合、ビューは別のモデルを更新するモデルを更新でき、これにより別のビューが更新される可能性があります。ある時点で、アプリの状態がいつ、なぜ、どのように制御できなくなったため、アプリで何が起こっているのか理解できなくなります。システムが不透明で非決定論的である場合、バグを再現したり、新しい機能を追加したりすることは困難です。
ngrx/store を使用すると、アプリで明確なデータ フローが得られるため、実際にこの問題を回避できます。
ngrx は redux に大いに影響を受けているため、同じ主な原則が適用されると言えます。
- 信頼できる唯一の情報源
- 状態は読み取り専用です
- 変更は純粋な関数で行われます
したがって、私の意見では、最大の利点は、アクションをディスパッチし、それらが常に 1 つの場所につながるため、ユーザーのやり取りを簡単に追跡し、状態の変化について推論できることです。単純なモデルでは、すべての参照を見つけて、何が何を変更し、何が変化するかを確認する必要があります。いつ。
ngrx/store を使用すると、devtoolsを使用して状態コンテナーのデバッグを確認し、変更を元に戻すこともできます。タイムトラベルが redux の主な理由の 1 つであったと思いますが、単純な古いモデルを使用している場合、これはかなり困難です。
@muetzerich が既に述べたように、テスト容易性も ngrx/store を使用する利点です。レデューサーは純粋な関数であり、これらの関数は簡単にテストできます。入力を受け取り、単に出力を返し、関数の外部のプロパティに依存せず、http 呼び出しなどの副作用がないためです。
要するに、これらのことを行うために ngrx/store を使用する必要はありませんが、共通のパターンを提供し、優れた利点をもたらす制限 (上記の 3 つの原則) に縛られることになります。 .
あなたの質問に:
複数のデータ タイプ (在庫、注文、顧客など) がある場合、アプリに複数のストアが必要ですか?
いいえ、複数の店舗を利用することはお勧めしません。
このような複数のデータ型を処理するようにアプリを構成 (設計) するにはどうすればよいですか?
おそらく、Tero Parviainen によるこのブログ投稿は、ストアの設計方法を理解するのに役立ちます。彼は、サンプル アプリのアプリケーション状態ツリーを設計する方法を説明しています。