首页 > 解决方案 > 是否应该触发所有减速器的 ngrx 操作

问题描述

我有一个非常简单的应用程序,并且是第一次使用 ngrx

减速器.module.ts

@NgModule({
 imports:[
  StoreModule.forRoot({
   sliceA: AReducer,
   sliceB: BReducer 
  })
 ]
})

Areducer.ts

export function AReducer(state, action : AActions) {
  switch(...)
}

BReducer.ts

export function AReducer(state, action : BActions) {
  switch(...)
}

一些组件.ts

store.dispatch(new AAction());

现在我希望ngrx 只会触发AReducer 而不是BReducer,但我看到它同时触发了两者。这也很不和谐,因为 BReducer 的第二个参数是一个 AAction,即使我将第二个参数参数化为类型 BAction。

那么有什么方法可以让 ngrx 只触发相关的减速器?还是它触发所有这些的设计,而无关紧要的只是微不足道的返回商店?

标签: angularreduxngrxngrx-store

解决方案


据我了解,这是典型的NgRx行为。对于,无论您在哪个文件中定义它们NgRx,所有这些都是独立/不相关的。对于,您将使用不同的文件以使其可维护,但会为每个调度的操作遍历所有减速器。actionsreducersNgRx

但是,您通常会在 a中做的reducer是,当执行 acase来处理操作时,如果您return从 that 开始case,则NgRx停止寻找其余的 reducer。

所以在你的情况下:

export function AReducer(state, action : AActions) {
  switch(action.type){
    case actions.AAction:
    return {...state} // this is when NgRx stops looking for the case to handle an action
  }
}

推荐阅读