我没有在任何地方找到一个好的答案,这似乎是一个毫无意义的惯例。在许多教程和文档中,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
对象中,从而错过了一些好处吗?
答案 0 :(得分:5)
这个惯例被称为Flux Standard Actions,其动机由Andrew Clark列出
如果我们可以对其形状做出某些假设,那么使用Flux动作要容易得多。例如,基本上所有Flux动作都有一个标识符字段,例如type,actionType或actionId。许多Flux实现还包括用于指示成功或失败的操作的方式,尤其是作为数据获取操作的结果。为这些模式定义最小的通用标准可以创建有用的工具和抽象。
他对FSA的全面建议值得一读。
https://github.com/acdlite/flux-standard-action
简而言之,它使编写中间件(如Sagas)更容易,也可以帮助Reducers处理错误状态。