【问题标题】:Why separate actions + reducers In Redux?为什么在 Redux 中分离 action + reducers?
【发布时间】:2016-08-16 08:56:33
【问题描述】:

我已经看到了将 action 和 reducer 分开的论点,因为它们具有多对多的关系。

我认为这实际上并不适用于 Redux。因为只有 1 个数据存储,所以对 reducer 的操作应该是一对多的。

通常,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
    }
}

我们可以将多个reducer 与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
        }
    }
}

使用“鸭子”模式,我们最终将主减速器与动作声明放在同一个模块中。

是否有任何理由将 reducers + action 与 redux 分开?

【问题讨论】:

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

标签: redux


【解决方案1】:

将动作创建者与reducer函数分开的主要原因是reducer函数必须是纯函数。如果你想在 action creator 中做一些事情,比如异步 API 调用,那么你不能把它放在 reducer 中。这个here有很好的解释。

【讨论】:

  • 我可以补充一点,你不希望你的 reducer 访问 ajax 调用、带有副作用的服务/函数......出于同样的原因(它们应该是纯粹的)。动作创建者可以访问服务,并随心所欲地创建副作用。如果您将动作创建者和减速器放在同一个地方,您的应用程序结构可能会使其过于意大利面。具体来说,我的 Angular2 应用程序是按模块构建的,我不希望我的 store-module 能够访问任何服务等。另一方面,动作创建者需要访问各种服务,因此他们需要访问更多...
  • 问题是为什么会这样,这里没有回答。
猜你喜欢
  • 1970-01-01
  • 2016-12-04
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2017-09-24
相关资源
最近更新 更多