Javascript 为什么Redux操作作为函数实现?

Javascript 为什么Redux操作作为函数实现?,javascript,redux,Javascript,Redux,我正在研究Redux是如何工作的,有一点我不能完全理解 通常,Redux操作是作为函数实现的。例如: const ACTION_INCREMENT = 'INCREMENT' const increment = function(amount) { return {type: ACTION_INCREMENT, amount: amount} } store.dispatch(increment(2)); 为什么动作不能作为类实现?我是说,我发现像这样更自然的东西: class Act

我正在研究Redux是如何工作的,有一点我不能完全理解

通常,Redux操作是作为函数实现的。例如:

const ACTION_INCREMENT = 'INCREMENT'
const increment = function(amount) {
   return {type: ACTION_INCREMENT, amount: amount}
}

store.dispatch(increment(2));
为什么动作不能作为类实现?我是说,我发现像这样更自然的东西:

class ActionIncrement {
    constructor(amount) {
      this.amount = amount;
    }
}

store.dispatch(new ActionIncrement(2));

很奇怪,没有人这样做。这种方法有问题吗?你指的是动作创建者,它们是返回动作(JS对象)的函数

以下是我现在可以想到的一些缺点:

  • 类在语法上更为复杂,导致样板代码更长,误用/错误的空间更大(例如,忘记指定一个
    type
    属性供还原器识别)

  • 动作创建者应该是无状态的。使用类可能会导致更多的误用/误解。当然,您也可以在函数上使用
    this
    ,但这不太常见(对于使用ES6箭头语法声明的函数来说也是不可能的)

  • 它将与许多现有的Redux库不兼容,例如
    redux thunk
    延迟将操作分派到还原器,从而允许在操作创建者中进行异步调用。为了使这些库支持类,所有类都必须同意有一个将被调用和等待的通用异步方法。这会导致更多的样板文件和误用/错误的空间

我建议阅读文档

遵循Flux、CQR和事件源、Redux的步骤 试图通过强制执行某些 更新的方式和时间限制。这些限制 都体现在Redux的三个原则中

您可以创建类,因为它们只是创建对象的语法糖,但是,与更显式的对象文字相比,这样做有什么好处


动作是一个简单的配置对象,没有副作用,它提供了很多好处,比如时间旅行和更可预测的调试,这是使用redux的主要优势之一。除了引入额外的代码外,使用IMO类还可以让人们创建一些改变状态的功能。

但我不明白为什么一个操作应该有一个类型。不能保证你会用它来选择减速器,不需要。关于动作创建者是无状态的,它不是一个无状态的构造函数吗?我从来没有见过一个状态完整的构造函数,可能是工厂,但不是构造函数。我不知道redux thunk,可能的话我会看一看。也许这与序列化有关?也许吧?我想我应该多玩一点React,看看我是否得到了它。如果它没有类型,减缩器会如何决定他们是否应该响应它?是否希望每个reducer使用不同的方法来检查操作是否与它相关?抱歉,我按enter键出错,正在编辑。您可以使用任何方法来检查操作是否适合您,例如:reducers.find((reducer)=>action instanceof reducer.expectedAction).reduce(state,action);或者你可以这样做:如果(action.amount>50)返回bigReducer(state,action)或者返回littleReducer(state,action),如果你执行
const instance=newactionincrement(2)
,然后在
ActionIncrement
中执行一些状态变异,然后执行
调度(instance)
,那么它就不再是无状态的。至于自定义reducer检查,您会使整个过程变得不必要的复杂,并降低操作/reducer的可预测性,并且您的项目将与其他库不兼容。我们将操作限制为标准形状/类型,以便不同的库可以更轻松地与给定的形状/类型假设一起工作。