如何在不创建单独的redux状态条目的情况下组合子reducer



我的问题可能听起来有点傻,我还在学习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状态。现在我的问题是,是否有一种方法可以将userpayments减速器组合在一起,而不会为payments创建单独的状态

更新状态的唯一方法是调度一个操作。因此,您应该在检索付款后分派一个操作,并修改userreducer来处理这个操作。还应该能够捕捉用户减速器中的任何动作。如果你不需要支付状态,你可以在user reducer中处理所有的动作。如果你想组合你的状态的部分检查combineReducers函数从redux

用户的默认情况下可以返回{…状态,支付:支付(状态)。付款,动作)}

然而,这看起来像是redux的反模式,我认为您应该考虑为什么要从user中删除case语句。把它们放在那里,可以让阅读代码的人很明显地看到这些操作会影响用户状态。

最新更新