typescript - 在 NGRX 中合并两个减速器
问题描述
我正在使用@ngrx@9.2.0,并且我有一个在工厂中创建的reducer,因为它对于我的项目中的多个实体是相同的。
function createEntityReducer(initialState, actions) {
const reducer = createReducer(
initialState,
on(actions.loadAll.success, (state, action) => {
...
})
);
return reducer;
}
const generalReducer = createEntityReducer(initialState, actions);
但我想为某个实体的特定操作扩展这个基本的减速器。
const specificReducer = createReducer(
initialState,
on(actions.loadChildren.success, (state, action) => {
...
})
);
如何合并两个减速器,而不必像这样创建嵌套功能?
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;
}
推荐阅读
- php - Quickbooks PHP SDK Oauth2 回调参数
- mysql - 如果值以逗号分隔,如何将 VARCHAR 值转换为 INT
- python - 如何将文本文件数据导出到mysql数据库
- java - RecylerView 项目未显示
- swift - 当 NSTextView 放入 NSTableView 时,滚动停止工作
- java - org.codehaus.mojo:exec-maven-plugin:1.4.0:exec 的问题
- c# - 为什么我的 Canvas 与我的设备上的位置不同?
- bash - 如何仅区分和修补新行
- firebase - Firebase 可调用函数给了我 CORS 问题
- java - 根据第一个 JComboBox 的选择,使第二个 JCombobox 可见