我的问题可能听起来有点傻,我还在学习react和redux。我的app中有user
这是用户状态的模式:
user : {
error,
isAuthed,
authToken,
isFetching,
currentRole,
roles : ['role', 'role'],
paymentsInfo: [{invoice}, {invoice}, {invoice}]
}
这是我的my reducer for user:
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
创建单独的状态
更新状态的唯一方法是调度一个操作。因此,您应该在检索付款后分派一个操作,并修改userreducer来处理这个操作。还应该能够捕捉用户减速器中的任何动作。如果你不需要支付状态,你可以在user reducer中处理所有的动作。如果你想组合你的状态的部分检查combineReducers函数从redux
用户的默认情况下可以返回{…状态,支付:支付(状态)。付款,动作)}
然而,这看起来像是redux的反模式,我认为您应该考虑为什么要从user中删除case语句。把它们放在那里,可以让阅读代码的人很明显地看到这些操作会影响用户状态。