目前重構角應用程序中使用NGRX店,有兩個選擇。這是我們的應用程序的基本結構。我相信大多數的角應用都是建立在相同的方式:NGRX和國家管理的子組件
AppComponent
|-- ContainerComponent
|-- ChildComponent1
| |-- GrandChildComponent
| |-- GrandGrandChildComponent
|-- ChildComponent2
的ContainerComponent注入Store<AppState>
。我試圖解決的問題是,GrandGrandChildComponent(比如DropDownMenu組件)必須根據應用程序的狀態來改變它的行爲(即在商店中發生的某些情況下禁用某些菜單項),並在點擊時發出一個事件在菜單項上如此ContainerComponent
(或任何其他組件,沒有必要的祖先)可以對它作出反應。
有一對夫婦的解決它的方法:使用@Input
/@Output
Store
到任何組件
- 通信的組件之間需要知道狀態
選項1是什麼我在文檔中閱讀的最常見/推薦的模式。所以只有ContainerComponent是胖的,所有的孩子都很瘦/笨,並且依賴於通過@Input
進入的狀態。
但從我看到的這種方法增加了很多樣板,你必須添加不必要的屬性只是爲了將狀態傳遞給Grand 子組件。而且它打破了關注點分離的原則,因爲任何中間組件都必須知道下面的組件需要什麼。如果知道僅在Grand組件上可用的詳細信息,那麼製作通用組件並不容易。
在另一方面,方法2似乎解決的分離關注的問題,它似乎也更清潔的實現。但由於我在使用redux
模式方面比較新,所以我不確定這是否可行,也許我不知道在重構過程中可能面臨的任何缺陷。
IMO,這兩種方法提供每個組件的測試的一個簡單的方法是一個巨大的對我。
我在這接近採取懷疑。我應該知道哪些缺陷?
感謝