NgRx - 对选择器的不同状态使用一个减速器

时间:2021-05-27 19:58:43

标签: angular ngrx ngrx-store

我有多个选择器,但是当我分派一个时,它们都获得相同的状态。为每个 Action 使用不同的 reducer 函数确实有效,但会产生大量重复代码。有没有办法创建一个通用的减速器?

export interface DataImportStoreState {
  dataImportAllocationClasses: fromReducers.DataImportState;
  dataImportFunds: fromReducers.DataImportState;
}

export const dataImportReducer: ActionReducerMap<DataImportStoreState> = {
  dataImportAllocationClasses: dataImportFundsReducer, // Works fine if i have dataImportAllocationClassesReducer
  dataImportFunds: dataImportFundsReducer,
};

export const getDataImportSoreState
  = createFeatureSelector<DataImportStoreState>(
  'dataImport',
);

export const getDataImportAllocationClassesState = createSelector(
  getDataImportSoreState,
  (state: DataImportStoreState) => state.dataImportAllocationClasses,
);

export const getDataImportFundsState = createSelector(
  getDataImportSoreState,
  (state: DataImportStoreState) => state.dataImportFunds,
);

这将是理想的。目前我唯一的解决方案是为每个导入制作其中一个。我有 15 个导入调用,我不想维护 15 个基本相同的单独文件。


export function dataImportFundsReducer(
  state = defaultDataImportState,
  action: fromActions.DataImportFundsAction | fromActions.ImportAllocationClassesAction,
): DataImportState {

  switch (action.type) {

    case fromActions.IMPORT_ALLOCATION_CLASSES:
    case fromActions.IMPORT_FUNDS: {

      console.log(action.type, action.payload);

      return {
        ...state,
      };
    }
}

1 个答案:

答案 0 :(得分:1)

您可以通过使用 combineReducers

<块引用>

使用高阶reducer

高阶reducer是一个以名称作为参数的函数 并返回一个新的 reducer 函数作为结果。我们可以使用这种模式 创建一个 reducer 的新实例

对于您的情况,this post 会很有用。