我创建了一些工厂功能,可以为我提供简单(或更高级)的缩减器。例如(简单的一个 - 基于动作类型集RequestState
常量作为值):
export const reduceRequestState = (requestTypes: RequestActionTypes) =>
(state: RequestState = RequestState.None, action: Action): RequestState => {
switch (action.type) {
case requestTypes.start:
return RequestState.Waiting;
case requestTypes.success:
return RequestState.Success;
case requestTypes.error:
return RequestState.Error;
case requestTypes.reset:
return RequestState.None;
default:
return state;
}
};
使用这些工厂函数和来自combineReducers
的{{1}}我可以将它们组合成功能齐全的减速器,以处理我的大多数临时操作。这给了我可读代码,并防止我犯了愚蠢的错误。
工厂适用于常见操作但是当我需要添加一些自定义行为(对于操作类型)时应该显着修改存储的某些部分我想写一个自定义部分的reducer将为我处理该操作。
我们的想法是以迭代的方式组合reducer,所以redux
但是对于一个数组。这样我就可以使用我的工厂创建reducer,然后将它与我的自定义reducer结合起来,处理一些特定的操作。然后,数组的combineReducers
将调用第一个,识别没有任何更改,并调用第二个(自定义)数据来处理操作。
我正在寻找一些解决方案并找到combineReducers
,但不太喜欢它将动作和缩减器联系起来的方式,这使得语义与我以前的语义略有不同。也许我没有得到它,但最终我喜欢看到我的减速机被写成纯函数。
我正在寻找一些能给我指路的提示。 是否有任何图书馆或项目使用任何类型的高阶减速器并以某种方式组合它们? 关于如上所述组成减速器是否有任何缺点?
答案 0 :(得分:5)
是的,因为reducer只是 函数,你可以通过无数种方式组织逻辑,并且非常鼓励非常鼓励组合多个函数。
"阵列中的减速器"你正在寻找的想法是https://github.com/acdlite/reduce-reducers。我经常在我自己的应用程序中使用它来实现这种行为 - 首先运行combineReducers
- 生成的reducer,然后依次运行reducers以获得更具体的行为。
我为Redux文档编写了一个名为Structuring Reducers的部分,其中涵盖了与reducer逻辑相关的一些主题。这包括超出通常combineReducers
方法的有用模式。
我还有一个many other reducer-related utilities列表,作为Redux addons catalog的一部分。