在 Redux 中组合高阶减速器

Composing higher order reducers in Redux

我创建了一些工厂函数,它们为我提供了简单(或更高级)的减速器。例如(简单的一个 - 基于操作类型设置 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;
        }
    };

使用这些工厂函数和 redux 中的 combineReducers 我可以将它们组合成功能齐全的 reducer 来处理我的大部分随意操作。这给了我可读的代码并防止我犯愚蠢的错误。

工厂适用于常见的操作,但是当我需要添加一些自定义行为(对于操作类型)时,它应该显着修改商店的某些部分,我想编写一个自定义的 reducer 部分来处理该操作为了我。 这个想法是以迭代的方式组成 reducer,所以 combineReducers 但是对于一个数组。这样我就可以使用我的工厂创建 reducer,然后将它与处理某些特定操作的自定义 reducer 结合起来。数组的 combineReducers 然后会调用第一个,发现没有任何变化并调用第二个(自定义)来处理操作。

我一直在寻找一些解决方案并找到了 redux-actions 但不太喜欢它链接动作和缩减器的方式,这使得语义与我习惯的没什么不同。也许我不明白,但最终我喜欢看到我的 reducer 被写成纯函数。

我正在寻找能给我指路的提示。 是否有任何库或项目使用任何类型的高阶减速器并以某种方式组合它们? 像上面描述的那样组合 reducer 有什么缺点吗?

是的,由于 reducer 只是 函数,因此组织逻辑的方式有无数种,非常鼓励将多个函数组合在一起.

您正在寻找的 "reducers in an array" 想法是 https://github.com/acdlite/reduce-reducers。我在我自己的应用程序中经常使用它来实现这种行为 - 首先 运行 一个 combineReducers 生成的减速器,然后 运行 减速器依次用于更具体的行为。

我为 Redux 文档编写了一个名为 Structuring Reducers 的部分,其中涵盖了许多与 reducer 逻辑相关的主题。这包括超出通常 combineReducers 方法的有用模式。

我还有一个列表many other reducer-related utilities as part of my Redux addons catalog