在 NGRX 中合并两个减速器
Merge two reducers in NGRX
我正在使用 @ngrx@9.2.0 并且我有一个在工厂中创建的减速器,因为它对于我项目中的多个实体都是相同的。
function createEntityReducer(initialState, actions) {
const reducer = createReducer(
initialState,
on(actions.loadAll.success, (state, action) => {
...
})
);
return reducer;
}
const generalReducer = createEntityReducer(initialState, actions);
但我想扩展这个基本的 reducer 以用于某个实体的特定操作。
const specificReducer = createReducer(
initialState,
on(actions.loadChildren.success, (state, action) => {
...
})
);
如何合并两个 reducer,而不必像这样创建嵌套特征?
const reducer = mergeReducers(generalReducer, specificReducer);
在检查了 @ngrx/store/createReducer 函数的工作原理后,我编写了以下似乎可以正常工作的代码。
function mergeReducers<TState>(
...reducers: ActionReducer<TState, Action>[]
): ActionReducer<TState, Action> {
const mergedReducers = (
state: TState | undefined,
action: Action
): TState => {
if (reducers.length === 0) {
throw new Error('At least one reducer was expected');
}
const newState = reducers.reduce((initialState, reducer) => {
const intermediaryState = reducer(initialState, action);
return intermediaryState;
}, state);
return newState as TState;
};
return mergedReducers;
}
我正在使用 @ngrx@9.2.0 并且我有一个在工厂中创建的减速器,因为它对于我项目中的多个实体都是相同的。
function createEntityReducer(initialState, actions) {
const reducer = createReducer(
initialState,
on(actions.loadAll.success, (state, action) => {
...
})
);
return reducer;
}
const generalReducer = createEntityReducer(initialState, actions);
但我想扩展这个基本的 reducer 以用于某个实体的特定操作。
const specificReducer = createReducer(
initialState,
on(actions.loadChildren.success, (state, action) => {
...
})
);
如何合并两个 reducer,而不必像这样创建嵌套特征?
const reducer = mergeReducers(generalReducer, specificReducer);
在检查了 @ngrx/store/createReducer 函数的工作原理后,我编写了以下似乎可以正常工作的代码。
function mergeReducers<TState>(
...reducers: ActionReducer<TState, Action>[]
): ActionReducer<TState, Action> {
const mergedReducers = (
state: TState | undefined,
action: Action
): TState => {
if (reducers.length === 0) {
throw new Error('At least one reducer was expected');
}
const newState = reducers.reduce((initialState, reducer) => {
const intermediaryState = reducer(initialState, action);
return intermediaryState;
}, state);
return newState as TState;
};
return mergedReducers;
}