reactjs - 在 redux 中处理获取状态的最佳方法
问题描述
我正在寻找在我的应用程序中处理获取状态的最佳方法,最简单的方法是为每个操作创建一个 isFetching[actionName] ,然后状态将如下所示:
state:{
todos:[...],
user[...],
isTodosFetching:true/false,
isUserFetching:true/false
}
但我正在寻找一种更优雅的方式来存储商店中的获取状态。
所以我尝试了另一种方法,并考虑创建一个 fetchingActionsReducer ,它将每个获取操作添加到商店中的 dict(object) 中,然后状态将如下所示:
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) => { switch (action.type) { case START_LOADING_TASK: return Object.assign({}, state, { [action.payload]: true }); case END_LOADING_TASK: return Object.assign({}, state, { [action.payload]: false }); 默认:返回状态;} };
actions:
export const startLoadingTask = (taskName) => ({ type: START_LOADING_TASK, payload: taskName, });
export const endLoadingTask = (taskName) => ({ type: END_LOADING_TASK, payload: taskName, });```
我试过它很完美,但我想知道,
1.有没有更好的方法来处理使用 redux 获取状态?2.现在很多作品集都会订阅loadingTasks状态,恐怕会导致性能问题。(对于加载任务中的每一次更改,所有反应都将为所有订阅的组件运行挖掘算法)
解决方案
我建议将获取状态与所请求的资源放在一起,例如:
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: [/* ... */]
}
}
推荐阅读
- jquery - jsp文件中的样式和脚本损坏
- c++ - QTimer isActive 返回真,但剩余时间返回 -1
- php - 按字母顺序对多维数组进行排序
- java - javafx 和数据库
- morris.js - Morris.js 数字和日期格式
- database - xampp phpmyadmin,格式参数不正确
- android - 用于自定义控件的 Xamarin 手势识别器
- r - 用r中的多个条件替换行值
- angular - *ngFor Angular Ionic Grid 种群
- spark-dataframe - java.lang.IllegalArgumentException:无法获取数组的 JDBC 类型