我的问题可能听起来有点愚蠢,我还在学习反应和减少。
我的应用中有user
,这是我的用户状态的架构:
user : {
error,
isAuthed,
authToken,
isFetching,
currentRole,
roles : ['role', 'role'],
paymentsInfo: [{invoice}, {invoice}, {invoice}]
}
这是我的用户缩减器:
function user(state = initialUserState, action) {
switch (action.type) {
case 'FETCHING_USER': {
return {
...state,
isFetching : true
}
}
case 'FETCHING_USER_ERROR': {
return {
...state,
isFetching : false,
error : action.error
}
}
case 'FETCHING_USER_SUCCESS': {
return {
// update user state
}
}
// payments reducer
case 'FETCH_PAYMENT_DETAILS': {
return {
...state,
payments : payments(state.payments, action)
}
}
case 'FETCH_PAYMENT_SUCCESS': {
return {
...state,
payments : payments(state.payments, action)
}
}
default:
return state
}
}
我在不同文件中维护付款减少器,user
减速器中的最后3个案例与payments
减速器的操作匹配:
function payments(state = initialPaymentState, action) {
switch (action.type) {
case 'FETCH_PAYMENT_DETAILS' : {
return {
...state,
isFetching : true
}
}
case 'FETCH_PAYMENT_ERROR' : {
return {
...state,
isFetching : false,
error : action.error
}
}
case 'FETCH_PAYMENT_SUCCESS' : {
return {
...state,
isFetching : false,
error : '',
invoices : action.paymentDetails
}
}
default:
return state
}
}
我没有为payments
维护单独的状态,但是当我从API收到付款数据时,我需要在user
状态更新。现在我的问题是,有没有办法将user
和payments
缩减器组合在一起而不为payments
创建单独的状态
答案 0 :(得分:0)
更新状态的唯一方法是分派操作。因此,您应该在检索付款后调度操作并修改用户缩减器以处理此操作。 还应该能够捕获用户减速器中的任何操作。如果您不需要付款状态,则可以处理用户reducer中的所有操作。如果您想将州的部分组合起来,请查看 redux
中的combineReducers函数答案 1 :(得分:0)
用户的默认情况可以返回{...州,付款:付款(state.payments,action)}
但是,这看起来像是redux的反模式,我认为你应该考虑为什么要从用户中删除case语句。将它们放在那里使得阅读代码的人明白这些操作会影响用户状态。