目前正在重构 Angular 应用程序以使用 ngrx 存储并有两个选项。这是我们应用程序的基本结构。我相信大多数 Angular 应用程序都是以相同的方式构建的:
AppComponent
|-- ContainerComponent
|-- ChildComponent1
| |-- GrandChildComponent
| |-- GrandGrandChildComponent
|-- ChildComponent2
ContainerComponent 已注入Store<AppState>
。我要解决的问题是 GrandGrandChildComponent(例如,DropDownMenu 组件)必须根据应用程序的状态更改其行为(即在商店中发生的某些条件下禁用某些菜单项)并在单击时发出事件在菜单项上,以便ContainerComponent
(或任何其他组件,不是必需的祖先)可以对其做出反应。
有几种解决方法:
@Input
使用/在组件之间进行通信@Output
- 注入
Store
任何需要知道状态的组件
选项 1 是我在文档中读到的最常见/推荐的模式。所以只有 ContainerComponent 是胖的,所有的孩子都是瘦的/笨的,并且依赖于通过@Input
.
但据我所知,这种方法添加了很多样板文件,您必须添加不必要的属性才能将状态传递给 Grand Child 组件。而且它还打破了关注点分离原则,因为任何中间组件都必须知道下面的组件需要什么。而且,如果它知道只有 Grand Components 上可用的详细信息,则制作通用组件并不容易。
另一方面,方法 2 似乎解决了分离关注点的问题,而且它似乎也是更清洁的实现。但由于我在使用redux
模式方面相对较新,所以我不确定这是否是正确的方法,也许我不知道当我在重构方面过于深入时可能会遇到任何陷阱。
IMO,这两种方法都提供了一种简单的方法来测试每个组件,这对我来说非常重要。
我很怀疑采取哪种方法。我应该注意哪些陷阱?
谢谢