2016-04-22 40 views
6

我已经看到分离动作和缩减器的论点,因为它们有多对多的关系。为什么单独操作+ reducer在Redux中?

我不认为这实际上适用于Redux。由于只有1个数据存储区,因此对还原器的操作应该是1对多的。

典型的reducer适用于特定数据存储的特​​定更改。

MY_ACTION = "MY_ACTION" 
function reducer(state, action) { 
    switch(action.type) { 
     case MY_ACTION: // stuff with my action to create new state 
     default: return state 
    } 
} 

我们可以结合多个减速带combineReducers为什么不能定义处理程序与动作本身的操作。

例如

class Action { 
    constructor(type) { 
     this.type = type 
     this.handlers = [] 
    } 
    add_handler(handler) { 
     this.handlers += handler 
    } 
    get_reducer() { 
     reducer = combineReducers(this.handlers) 
     return (state, action) => { 
      if(action.type == this.type) { 
       return reducer(state, action) 
      } 
      return state 
     } 
    } 
} 

随着“鸭子”的格局,我们最终把主减速器相同的模块作为行动宣言英寸

是否有任何理由让Reduce +动作与redux分开?

+0

我不知道你在问什么或说明。 – JMM

回答

3

将动作创建者与reducer函数分开的主要原因是reducer函数必须是纯函数。如果您想在动作创建器中执行某些操作(例如异步API调用),则无法将其放入reducer中。关于这个here有一个很好的解释。

+0

我可以补充说,你不希望你的reducer访问ajax调用,服务/函数与sideeffects ..出于同样的原因(他们应该是纯粹的)。 动作创建者可以访问服务,并创建所有他们想要的副作用。也许您的应用程序结构使得它太细意大利式样,如果您将动作创建者和缩减器放在同一个地方。 具体而言,我的Angular2应用程序是模块化结构,我不希望我的商店模块能够访问任何服务等。 另一方面,动作创建者需要访问各种服务,所以他们需要访问更多... – Spock

相关问题