我正在寻找在应用程序中处理获取状态的最佳方法,最简单的方法是为每个操作创建一个isFetching[actionName],然后状态看起来像这样:
state:{
todos:[...],
user[...],
isTodosFetching:true/false,
isUserFetching:true/false
}
但我正在寻找一种在商店中存储获取状态的更优雅的方式。
因此,我尝试了另一种方法,并考虑创建一个fetchingActionsReducer,它将每个fetchingAction添加到存储中的dict(对象(中,然后状态将如下所示:
todos:[...],
user[...],
loadingTasks:{
isTodosFetching:true/false,
isUserFetching:true/false
}}```
now every component will get loadingTasks with mapStateToProps and that's it.
this will reduce the boilerplate to one simple reducer and one action.
reducer:
export const loadingTasks=(state={},action(=>{开关(动作类型({案例START_LOADING_TASK:return Object.assign({},state,{[action.epayload]:true}(;case END_LOADING_TASK:return Object.assign({},state,{[action.epayload]:false}(;默认值:返回状态;}};
actions:
export const startLoadingTask=(taskName(=>({类型:START_LOADING_TASK,payload:taskName,});
export const endLoadingTask=(taskName(=>({类型:END_LOADING_TASK,payload:taskName,});```
我试过了,它很完美,但我想知道,
1。有什么更好的方法可以用redux处理获取状态?2.现在许多投资组合将订阅loadingTasks状态,并且我担心这会导致性能问题。(对于加载任务的每一次更改,所有react都将为所有订阅的组件运行挖掘算法(
我建议将获取状态与请求的资源放在同一位置,例如:
state:{
todos: {
isFetching: true, // or false
data: [/* ... */]
},
user: {
isFetching: true, // or false
data: [/* ... */]
}
}
这样,当todos
的获取状态发生变化时,只有依赖于todos的组件才会重新发送。
这种方法还支持其他状态。
例如,如果todos请求失败,则可能会出现错误状态。或者,如果用户请求失败,则错误消息会提供一些上下文,甚至包含从API返回的错误:
state:{
todos: {
isFetching: false,
hasError: true, // or false
data: [/* ... */]
},
user: {
isFetching: false,
errorMessage: 'Please check username exists', // or null
data: [/* ... */]
}
}