2016-11-22 29 views
1

我创建了一些工厂函数,它们为我提供了简单(或更高级)的reducer。例如(简单的 - 行动型的基础设置RequestState常数的值):在Redux中编写高阶缩减器

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我可以撰写他们入处理大部分的我不经意的动作功能齐全的减速。这给了我可读的代码,并防止我犯愚蠢的错误。

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

我正在寻找一些解决方案,发现redux-actions,但不太喜欢它链接动作和减速器的方式,使得语义与我以前所用的语义有点不同。也许我不明白,但最终我希望看到我的减速器被写成纯功能。

我找的一些提示,会告诉我的方式。 是否有任何图书馆或项目使用任何一种更高阶的减速器并以某种方式将它们组合在一起? 关于如上所述组成减速器有什么不利之处吗?

回答

2

没错,因为减速是只是功能,还有的可以组织逻辑方式无限数量,并组成多个功能结合在一起是非常鼓励

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

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

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