Redux将调度状态更改操作。 redux中动作类型的命名约定是什么?
答案 0 :(得分:19)
社区周围有一些约定,我会列出我所知道的并认为在这里很有用的公约:
最常见的惯例是将动作类型(“事件类型”)保留在CONSTANT_CASE
中。
这可以避免拼写错误,其中操作的类型为my_type
,但缩减器需要my-type
或My_Type
类型。
另一个非常常见的惯例是将操作类型保存在单独的文件中作为常量,例如var MY_ACTION_TYPE = 'MY_ACTION_TYPE';
,并从那里使用它们。
这也可以避免拼写错误,因此您不希望某个操作的类型为MY_ACTION_TYP
。如果该变量不存在,您将立即收到错误,特别是如果您正在掉落。
一个不太常见但非常有用的约定是将操作范围限定为项目和域。 Erik Rasmussen在"Ducks" proposal中推广了这种方法,它指定了动作类型必须采用这种形式:var MY_ACTION_TYPE = 'appname/domain/MY_ACTIONTYPE'
。
这避免了两个具有相同值的动作常量的情况。例如。假设您有一个管理区域和面向用户的区域,并且两者都有调度'CHANGE_USERNAME'
操作类型的表单。这将使两个减速器拾取相同的动作,其中一个不应该选择另一个。这可能发生在意外,并且非常讨厌追踪。通过在应用程序和域名前添加前缀,可以避免此问题:'appname/admin/CHANGE_USERNAME'
与'appname/user/CHANGE_USERNAME'
不同!
这是我所知道和使用的所有惯例,但我确信其他人有更多 - 你在项目中使用了什么并发现有用?
答案 1 :(得分:13)
还有一些围绕命名异步操作类型的约定。如果您有一组操作来表示获取用户的api调用,则可以将它们拆分为以下内容:
FETCH_USER_REQUEST
- 当您第一次发送api电话时FETCH_USER_SUCCESS
- 用于api调用完成并成功返回数据FETCH_USER_FAIL
- 对于api调用失败并回复错误,FETCH_USER_COMPLETE
- 有时在通话结束时使用,无论状态如何答案 2 :(得分:1)
有一种新模式可以解决这个问题,redux-auto。
它将减速器组成的思想更进一步。而不是有一个代表你的reducer和创建单独的动作函数的文件。
redux-auto的方法是让文件夹包含单独的JS文件,表示状态上的每个操作/转换,并将其动态地公开为函数
例如
└── store/
├──user/
│ └── index.js
│ └── changeName.js
└──posts/
└── index.js
└── delete.js
现在,无论如何,你可以在你的应用程序中编写
import actions from 'redux-auto'
...
actions.user.changeName({name:"bob"})
存储/用户/ changeName.js
export default function (user, payload) {
return Object.assign({},user,{ name : payload.name });
}
多数民众赞成!
如果您想在第三方Reducer中监听redux操作。您可以使用对功能进行宽松的质量检查。
action.type == actions.user.changeName // "USER/CHANGENAME"
对于更高级的内容,您甚至可以查看特定减速器是否拥有某个操作
// Returns true if it's an action specifically for user
if(action.type in actions.user)
您可以在project page
上阅读更多内容答案 3 :(得分:0)