从另一个reducer中访问reducer状态

问题描述 投票:6回答:3

我有一个减速器,我在调度动作时重新调整适当的状态。现在我定期调用API,结果会一次又一次地触发一个动作。所以我想要的是,如果reducer状态已经有数据,那么另一个reducer在发送调用时不会显示加载状态。仅在第一次接收数据时必须保持其加载状态。我希望我能够正确解释它

这是我的代码片段

装载状态减速机

const loading = (state = false, action) => {

    switch (action.type) {
    case 'GET_AUDIT_DATA':         // here I want to return true only when there is no data available
        return true
    case 'GET_AUDIT_DATA_RECEIVED':  
        return false
    case 'GET_AUDIT_DATA_ERROR':
        return false
    default:
        return state
    }
}

结合减速器

const allReducers = combineReducers({
    auditData: AuditData,
    auditLoading: AuditLoading,
    modifiedOrders: ModifiedOrders
});

export default allReducers;

Reducer返回由superagent触发的动作数据

const auditData = (state = [], action) => {
    switch(action.type) {
        case 'GET_AUDIT_DATA_RECEIVED': 
        console.log(action.data);
            return action.data;
        case 'GET_AUDIT_DATA_ERROR': 
            return action.err;
        default :
            return state;
    }
}
export default auditData;

所以最初auditData不包含任何数据,只有在第一次成功调用后才返回数据。当同时调用loading state reducer时,只有当审计数据缩减器不包含任何数据时,才应在GET_AUDIT_DATA动作中返回true。

也正在以正确的方式从auditData返回当前获得的数据,或者我应该采用不同的方式。基本上我想与overwrite current data new one

reactjs redux react-redux reducers
3个回答
2
投票

继续进行的最佳方法是向Loading state reducer发送一个信息,以了解其他reducer是否已有数据。最后:

const loading = (state = false, action) => {

    switch (action.type) {
    case 'GET_AUDIT_DATA':
        if(!action.dataAlreadyInitialized){
            return true
        }
    case 'GET_AUDIT_DATA_RECEIVED':  
        return false
    case 'GET_AUDIT_DATA_ERROR':
        return false
    default:
        return state
    }
}

您应该可以从操作功能访问应用程序状态并执行以下操作:

dispatch({
  type:'GET_AUDIT_DATA',
  dataAlreadyInitialized: appState.auditData.length > 0
});

7
投票

您可以在商店中调用getState()以获取Reducer列表以及reducers中的当前状态。

  1. store导入auditLoading(使用商店获取值。不要改变商店)
  2. store.getState().auditLoading将为您提供auditLoading减速机的状态。

这种方法类似于redux-thunk提供的回调。其中(dispatch, getState) => {}将返回该行动。


0
投票
import store from '../../../redux/store'

console.log(store.getState().loginReducer.accessToken)

通过这个声明,我们将获得accessToken的状态

© www.soinside.com 2019 - 2024. All rights reserved.