我有一个减速器,我在调度动作时重新调整适当的状态。现在我定期调用API,结果会一次又一次地触发一个动作。所以我想要的是,如果减速器状态已经有数据,那么另一个减速器在发送呼叫时不会显示加载状态。仅在第一次接收数据时必须保持其加载状态。我希望我能够正确解释
以下是我的代码段
加载状态缩减器
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
。
答案 0 :(得分:7)
您可以通过商店调用getState()
来获取减速器列表以及减速器内的当前状态。
store
导入auditLoading
(使用商店获取值。不要改变商店)store.getState().auditLoading
将为您提供auditLoading
reducer。此方法类似于redux-thunk
提供的回调。其中(dispatch, getState) => {}
将返回到操作。
答案 1 :(得分:1)
最好的方法是向加载状态缩减器发送一个信息,以了解其他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
});
答案 2 :(得分:1)
可接受的答案很好(通过操作传递数据长度),但是如果这是一条广泛使用的信息,则可能会很费力。对于某些可能会被每个操作使用的“当前用户”之类的东西,有时还有另一种解决方案更为可取。
根据Redux FAQ https://redux.js.org/faq/reducers,将第三个参数添加到reducer函数是完全可以接受的。即:
加载状态减少器
const loading = (state = false, action, noData) => {
switch (action.type) {
case 'GET_AUDIT_DATA':
return noData
case 'GET_AUDIT_DATA_RECEIVED':
return false
case 'GET_AUDIT_DATA_ERROR':
return false
default:
return state
}
}
组合减速器
不幸的是,这意味着我们必须编写代码来组合化简器,而不是使用CombineReducers快捷方式。但这并不太难,只要发生任何更改,您就可以调用每个reducer并创建一个新对象:
const allReducers = (state = null, action) => {
const auditData = AuditData(state?.auditData, action);
const auditLoading = AuditLoading(state?.auditLoading, action, !state?.auditData?.length);
const modifiedOrders = ModifiedOrders(state?.modifiedOrders, action);
return (auditData !== state?.auditData ||
auditLoading !== state?.auditLoading ||
modifiedOrders !== state?.modifiedOrders) ?
{ auditData, auditLoading, modifiedOrders } : state;
});
export default allReducers;
注意将第三个参数传递给AuditLoading缩减程序。其他reducer或调用该动作的代码都不需要更改。哪个好!
答案 3 :(得分:0)
import store from '../../../redux/store'
console.log(store.getState().loginReducer.accessToken)
通过此语句,我们将获得accessToken的状态