Derzeit Refactoring Angular-Anwendung zur Verwendung von ngrx speichern und haben zwei Optionen. Hier ist unsere Grundstruktur der Anwendung. Ich glaube, dass die meisten Angular-Anwendungen die gleiche Art und Weise gebaut:NGRX und Zustand-Management für Kind-Komponenten
AppComponent
|-- ContainerComponent
|-- ChildComponent1
| |-- GrandChildComponent
| |-- GrandGrandChildComponent
|-- ChildComponent2
ContainerComponent Store<AppState>
injiziert hat. Das Problem, das ich zu lösen versuche, ist, dass GrandGrandChildComponent (sagen wir, DropDownMenu-Komponente) sein Verhalten basierend auf dem Zustand der Anwendung ändern muss (dh einige Menüelemente unter bestimmten Bedingungen im Speicher deaktivieren) und ein Ereignis ausgeben, wenn darauf geklickt wird auf Menüpunkt so ContainerComponent
(oder eine andere Komponente, nicht notwendig Vorfahren) könnte darauf reagieren.
Es gibt ein paar Möglichkeiten, es zu lösen:
- zwischen Komponenten kommunizieren
@Input
/@Output
- Inject
Store
in jede Komponente, die den Staat zu wissen, erfordert
Option 1 ist, was am häufigsten/empfohlenes Muster, das ich in den Dokumenten gelesen habe. Also nur ContainerComponent ist fett und alle Kinder sind dünn/dumm und verlassen sich auf den Zustand, der durch @Input
kommt.
Aber von dem, was ich sehe, fügt dieser Ansatz viele Boilerplate hinzu, wo Sie unnötige Attribute hinzufügen müssen, nur um den Zustand zu Grand Child-Komponenten zu übergeben. Und es bricht auch das Prinzip der Trennung der Interessen, weil alle Zwischenkomponenten wissen müssen, was in den darunter liegenden Komponenten benötigt wird. Und es ist nicht einfach, eine generische Komponente zu erstellen, wenn sie die Details kennt, die nur für Grand Komponenten verfügbar sind.
Auf der anderen Seite scheint Ansatz 2 das Problem der Trennung von Bedenken zu lösen und es scheint auch eine sauberere Umsetzung zu sein. Aber da ich relativ neu in der Verwendung von redux
Muster bin, bin ich mir nicht sicher, ob das der Weg ist und vielleicht kenne ich keine Fallstricke, denen ich begegnen könnte, wenn ich zu tief im Refactoring sein werde.
IMO, bieten beide Ansätze eine einfache Möglichkeit zum Testen von jeder Komponente, die für mich sehr groß ist.
Ich bin im Zweifel, welchen Ansatz zu nehmen. Welche Fallstricke sollte ich beachten?
Dank