如何组合子减速器而不在redux中创建状态单独的条目

时间:2016-09-13 08:15:35

标签: redux

我的问题可能听起来有点愚蠢,我还在学习反应和减少。 我的应用中有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状态更新。现在我的问题是,有没有办法将userpayments缩减器组合在一起而不为payments创建单独的状态

2 个答案:

答案 0 :(得分:0)

更新状态的唯一方法是分派操作。因此,您应该在检索付款后调度操作并修改用户缩减器以处理此操作。 还应该能够捕获用户减速器中的任何操作。如果您不需要付款状态,则可以处理用户reducer中的所有操作。如果您想将州的部分组合起来,请查看 redux

中的combineReducers函数

答案 1 :(得分:0)

用户的默认情况可以返回{...州,付款:付款(state.payments,action)}

但是,这看起来像是redux的反模式,我认为你应该考虑为什么要从用户中删除case语句。将它们放在那里使得阅读代码的人明白这些操作会影响用户状态。