问题
我想使用ngrx链接多个高阶reducer,这样我reducer中类似的代码部分只有一个实现。
我的应用程序有许多页面具有非常相似的功能。他们的减速器看起来也很相似。对于此示例,让我们考虑一个具有三页的应用程序:第一页、第二页和第三页。这些页面中的每一个都包含一个计数器,但允许用它做不同的事情。所以:
- 第一页可以增加和减少计数器的值
- 第二页可以增加、减少和重置计数器的值
- 第三页可以增加和重置计数器的值
可以在此处找到此类应用程序的示例。这是非常幼稚的实现,每个页面都有单独的减速器 - 每个减速器中重复了许多非常相似的功能。
仅使用一台高阶减速机的解决方案
我设法使用高阶化简器将部分通用逻辑移动到分离代码段。在这种情况下,它是增量功能:
interface Actions {
incrementAction: ActionCreator<string>;
}
export const withIncrementation = ({ incrementAction }: Actions) => (
initState,
...actions
) =>
createReducer(
initState,
on(incrementAction, state => ({
...state,
counter: state.counter + 1
})),
...actions
);
这个高阶减速器可以这样使用:
const pageOneReducer = withIncrementation({
incrementAction: PageOneActions.IncrementRequested
})(
initialState,
on(PageOneActions.DecrementRequested, (state: State) => ({
...state,
counter: state.counter - 1
}))
);
export function reducer(state: State | undefined, action: Action) {
return pageOneReducer(state, action);
}
到目前为止,一切正常。像这样正常工作的应用程序在这里
使多个高阶减速器工作的问题
当我尝试链接多个高阶减速器工作时,问题就开始了。在示例应用程序中,第二页和第三页都能够重置计数器(也可以递增),所以我现在想使用 2 个高阶减速器。我准备了新的高阶减速器,与前一个非常相似,应该可以完成工作:
export const withReseting = ({ resetAction }: Actions) => (
initState,
...actions
) =>
createReducer(
initState,
on(resetAction, state => ({
...state,
counter: initialState.counter
})),
...actions
);
它单独工作时工作正常,但是我找不到一种方法让它以这样的方式工作,withIncrementation和withReseting在同一个减速器上工作正常。可以在此处找到我尝试实现的示例应用程序,但它不起作用(似乎我的状态根本停止工作)。