(DRY = 不要重复自己)
我有两个状态。一种涉及汽车,一种涉及飞机。
所有动作都是复制粘贴并更改动作名称。
所有效果都是复制粘贴并更改效果名称和请求 URL。
所有的减速器本质上都是复制和粘贴。
有什么方法可以避免 ngrx 中的这种重复吗?
首先请记住,actions/reducer 不是样板文件。虽然感觉可能如此,但这并不是因为您的域不同,例如员工不是订单。
也就是说,有 @ngrx/entity 可以管理您的收藏。
还有 ngrx-data 可以创建你所说的一切(动作、减速器、效果和服务)。
当然有,您可以完美地将泛型应用于状态和效果。操作在您的商店中按其类型进行标识,因此请确保将其包括在内,然后就可以开始了。
可悲的结果是,当使用你的动作时,你需要添加逻辑,因为
store.dispatch(new Load('car'));
坦率地说,不太好,也不太安全
store.dispatch(new LoadCar());
对于效果,是的,您可以创建一个接受多种类型的效果:
$loadCar = this.actions.pipe(
ofType([VehicleActions.loadCar, VehicleActions.loadTruck]),
this.applyLoadLogic
)
$loadTruck = this.actions.pipe(
ofType(VehicleActions.loadTrailer),
obs => this.applyLoadLogic(obs, false)
)
applyLoadLogic(in: Observable<Action>, canDrive: boolean = true): Observable<Action> {
return in.pipe(
map(action => this.doMagic(action.payload, canDrive))
);
}
不,这是 ngrx(redux) 著名的“样板”,但请注意 ngrx 的作者给出了一些很好的提示
使用 NgRx 减少样板 - Brandon Roberts 和 Mike Ryan
https://www.youtube.com/watch?v=t3jx0EC-Y3c