現在、ngrx ストアを使用するように Angular アプリケーションをリファクタリングしており、2 つのオプションがあります。アプリケーションの基本構造は次のとおりです。ほとんどの Angular アプリケーションは同じように構築されていると思います。
AppComponent
|-- ContainerComponent
|-- ChildComponent1
| |-- GrandChildComponent
| |-- GrandGrandChildComponent
|-- ChildComponent2
ContainerComponent は を注入しStore<AppState>
ました。私が解決しようとしている問題は、GrandGrandChildComponent (たとえば、DropDownMenu コンポーネント) がアプリケーションの状態に基づいて動作を変更し (つまり、ストアで発生する特定の条件でいくつかのメニュー項目を無効にする)、クリック時にイベントを発行する必要があることです。メニュー項目でContainerComponent
(または祖先でなくても、その他のコンポーネントが) それに反応する可能性があります。
それを解決するには、いくつかの方法があります。
@Input
/を使用してコンポーネント間で通信する@Output
Store
状態を知る必要があるコンポーネントに注入する
オプション 1 は、ドキュメントで読んだ中で最も一般的/推奨されるパターンです。したがって、ContainerComponent のみが太く、すべての子はシン/ダムであり、 を介して入ってくる状態に依存し@Input
ます。
しかし、私が見たところ、このアプローチは多くのボイラープレートを追加し、状態を孫のコンポーネントに渡すためだけに不要な属性を追加する必要があります。また、中間コンポーネントは下にあるコンポーネントで何が必要かを知る必要があるため、懸念の分離の原則を破ります。また、グランド コンポーネントでしか利用できない詳細を知っていると、ジェネリック コンポーネントを作成するのは容易ではありません。
一方、アプローチ 2 は、関心の分離の問題を解決しているようであり、よりクリーンな実装でもあるようです。しかし、私はredux
パターンの使用に比較的慣れていないため、それが正しい方法であるかどうかはわかりません。おそらく、リファクタリングに深く入り込みすぎたときに直面する可能性のある落とし穴も知らないでしょう。
IMO、両方のアプローチは、私にとって非常に大きな各コンポーネントのテストの簡単な方法を提供します.
どのアプローチをとるべきか迷っています。どのような落とし穴に注意する必要がありますか?
ありがとう