在导入功能存储商店后调度动作时,为什么多次调用我的reducer?

我是ngrx的新手,我试图为我的每个功能模块都提供一个状态,并为应用程序模块提供一个状态。首先,我注册了StoreModule,它在app.module.ts中的作用是这样的:

@NgModule({
  declarations: [
    ...
  ],imports: [
    ...,StoreModule.forRoot({app: fromApp.reducer}),EffectsModule.forRoot([AppEffectsService])
  ],bootstrap: [AppComponent]
})
export class AppModule { }

然后我创建了一个名为home的模块,该模块带有reducer and Effects服务,并像这样使用它们:

@NgModule({
  declarations: [
    ...
  ],HomeRoutingModule,StoreModule.forFeature(fromHome.homeFeatureKey,fromHome.reducer),EffectsModule.forFeature([HomeEffectsService]),]
})
export class HomeModule { }

我在家用减速器中放入了console.log,每次执行一个动作时,我都会看到两次记录!我现在不知道为什么我的减速器每次调度都要调用两次。甚至当我将存储添加到更多模块时,我也会看到重复的日志。

Reducer看起来像这样:


const homeReducer = createReducer(
    initialHomeState,on(Homeactions.loadOrderTypesSuccess,(state,{ orderTypes }) => ({ ...state,orderTypes })),);

export function reducer(state: HomeState | undefined,action: action) {
    console.log(action.type);
    return homeReducer(state,action);
}

这是我的效果:

  loadOrderTypes$ = createEffect(() => this.actions$.pipe(
    ofType(Homeactions.loadOrderTypes),mergeMap(() => from(this.dataService.getOrderTypes())
      .pipe(
        map(orderTypes => Homeactions.loadOrderTypesSuccess({ orderTypes })),catchError(error => of(Homeactions.loadOrderTypesFailure({ error }))),)
    )
  ));

动作的创建:

export const loadOrderTypes = createaction(
    '[Home Page] Load order type start'
);

export const loadOrderTypesSuccess = createaction(
    '[Home Page] Load order type success',props<{ orderTypes: OrderType[] }>()
);

export const loadOrderTypesFailure = createaction(
    '[Home Page] Load order type failure',props<{ error: any }>()
);

分派操作后,日志为:

@ngrx/store/init
15:23:36.470 app.reducer.ts:22 @ngrx/effects/init
15:23:36.505 core.js:38781 Angular is running in the development mode. Call enableProdmode() to enable the production mode.
15:23:36.608 app.reducer.ts:22 @ngrx/store/update-reducers
15:23:36.609 home.reducer.ts:35 @ngrx/store/update-reducers
15:23:36.644 app.reducer.ts:22 [Home Page] Load order type start
15:23:36.644 home.reducer.ts:35 [Home Page] Load order type start
15:23:36.761 client:52 [WDS] Live Reloading enabled.
15:23:37.743 app.reducer.ts:22 [Home Page] Load order type success
15:23:37.744 home.reducer.ts:35 [Home Page] Load order type success

我希望我的减速器被调用一次。我在做什么错了?

tl_tl2009 回答:在导入功能存储商店后调度动作时,为什么多次调用我的reducer?

动作是分派给所有减速器的,这是设计使然。

我们不知道要调用哪个reducer,因为完全可以根据另一个模块的动作来修改状态。

本文链接:https://www.f2er.com/3129534.html

大家都在问