将数据放入Redux操作中的“payload”键中有什么好处?

时间:2017-04-29 06:48:15

标签: javascript reactjs redux flowtype

我没有在任何地方找到一个好的答案,这似乎是一个毫无意义的惯例。在许多教程和文档中,Redux操作定义如下:

{
  type: "ACTION_NAME",
  payload: {
    foo: 123,
    bar: 456,
  }
}

payload对象有什么意义?为什么不写这个:

{
  type: "ACTION_NAME",
  foo: 123,
  bar: 456,
}

我正在使用Flow,我喜欢将所有操作类型定义为union,没有嵌套的有效负载:

type Action = {
  type: 'ACTION_NAME',
  foo: number,
  bar: number,
} | {
  type: 'ANOTHER_ACTION',
  someData: string,
} | {
  type: 'ONE_MORE_ACTION',      
  moreData: boolean,
}

我不必多次输入payload,我会自动完成并对我的所有操作进行类型检查,所以我不确定我缺少什么。

我没有将所有数据都放在payload对象中,从而错过了一些好处吗?

1 个答案:

答案 0 :(得分:5)

这个惯例被称为Flux Standard Actions,其动机由Andrew Clark列出

  

如果我们可以对其形状做出某些假设,那么使用Flux动作要容易得多。例如,基本上所有Flux动作都有一个标识符字段,例如type,actionType或actionId。许多Flux实现还包括用于指示成功或失败的操作的方式,尤其是作为数据获取操作的结果。为这些模式定义最小的通用标准可以创建有用的工具和抽象。

他对FSA的全面建议值得一读。

https://github.com/acdlite/flux-standard-action

简而言之,它使编写中间件(如Sagas)更容易,也可以帮助Reducers处理错误状态。