这样做是否有效:
export const nextUser = () => {
// calculation here
return {
type: 'UPDATE_USER',
payload: userObject
};
};
export const prevUser = () => {
// calculation here
return {
type: 'UPDATE_USER',
payload: userObject
};
};
在这里,我有两个动作创建者,它们的操作非常相似。两者都更新一个用户对象,但是一个正在前进,另一个则向后。让他们两个都调度相同的动作是否有效?最后,reducer将收到一个用户对象并进行更新,因此它不必知道我们要转到下一个还是上一个User。还是因为我的动作创建者的名字与我的减速器的名字不同而被认为是不干净的?
答案 0 :(得分:0)
技术上没有问题,但是...
在这里,我有两个动作创建者,它们的操作非常相似
不相似,但确切的操作。
两者都更新用户对象
这些只是动作创建者,他们代表dput(df)
structure(list(`_Id` = structure(list(as.raw(c(0x56, 0xfd, 0x36,
0xaf, 0x63, 0x18, 0x77, 0x2a, 0x09, 0x35, 0x9f, 0xe3)), as.raw(c(0x56,
0xfd, 0x37, 0x07, 0x63, 0x18, 0x77, 0x2a, 0x09, 0x35, 0x9f, 0xeb
)), as.raw(c(0x56, 0xfd, 0x38, 0x7a, 0x63, 0x18, 0x77, 0x2a,
0x09, 0x35, 0xa0, 0x07)), as.raw(c(0x56, 0xfd, 0x38, 0x8b, 0x63,
0x18, 0x77, 0x2a, 0x09, 0x35, 0xa0, 0x0e)), as.raw(c(0x56, 0xfd,
0x38, 0x9d, 0x63, 0x18, 0x77, 0x2a, 0x09, 0x35, 0xa0, 0x12))), class = "ODBC_binary")), class = "data.frame", row.names = c(NA,
5L))
,他们实际上并没有“做”任何事情。
计算下一个状态的单位是(应该是)"56fd36af6318772a09359fe3"
,如果减速器不关心它是action
还是reducer
,那么我看不到有任何理由要执行两个具有不同名称的相同操作(prevUser
和nextUser
相同)。
修改
我刚刚注意到代码中的type
注释,如果这意味着您正在做一些副作用,那么计算下一个状态的位置实际上是在动作创建者/中间件内部(归约器应该是纯)。
答案 1 :(得分:0)
如果您将这些动作传递或分派给其他reducer没问题。但是如果将这些动作分派给同一个reducer,则该reducer无法检测到发生了哪个动作,因为两个动作的类型相同。两种类型都是“ UPDATE_USER”。
您可以使用这种方法:
export const nextUser = (userObject) => {
// calculation here
return {
type: 'UPDATE_USER',
payload: {
userType: "NEXT_USER"
userData: userObject
}
};
};
export const prevUser = (userObject) => {
// calculation here
return {
type: 'UPDATE_USER',
payload: {
userType: "PREV_USER"
userData: userObject
}
};
};
并通过userType处理reducer函数中的情况。