【问题标题】:Composing higher order reducers in Redux在 Redux 中编写高阶 reducer
【发布时间】:2017-04-06 14:17:30
【问题描述】:

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

使用这些工厂函数和来自reduxcombineReducers,我可以将它们组合成功能齐全的reducer 来处理我的大部分休闲动作。这给了我可读的代码并防止我犯愚蠢的错误。

工厂适用于常见操作,但是当我需要添加一些自定义行为(用于操作类型)时,它应该显着修改商店的某些部分. 这个想法是以迭代的方式组合reducers,所以combineReducers但是对于一个数组。通过这种方式,我可以使用我的工厂创建减速器,然后将其与处理某些特定操作的自定义减速器结合起来。然后数组的combineReducers 将调用第一个数组,识别出没有任何变化并调用第二个(自定义)数组来处理操作。

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

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

【问题讨论】:

    标签: redux higher-order-functions reducers


    【解决方案1】:

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

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

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

    我还有一个many other reducer-related utilities 列表作为我的Redux addons catalog 的一部分。

    【讨论】:

    猜你喜欢
    • 2023-03-11
    • 2020-09-13
    • 2020-04-24
    • 1970-01-01
    • 2019-10-09
    • 2018-11-15
    • 2017-07-20
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多