Reactjs 混淆react redux减速器状态设计
例如,我有一个reducer来操作用户状态,比如创建用户、编辑、获取用户 我是否应该为每个操作创建状态,如:Reactjs 混淆react redux减速器状态设计,reactjs,redux,react-redux,Reactjs,Redux,React Redux,例如,我有一个reducer来操作用户状态,比如创建用户、编辑、获取用户 我是否应该为每个操作创建状态,如: { loadingForFetching: false, fetchingResult: null, fetchingError: '', loadingForEditing: false, editingResult: null, editingError:'', loadingForCreating: false, creatingResult:
{
loadingForFetching: false,
fetchingResult: null,
fetchingError: '',
loadingForEditing: false,
editingResult: null,
editingError:'',
loadingForCreating: false,
creatingResult: null,
creatingError: ''
}
或者让这三个动作共享相同的状态:
{
loading: false,
result: null,
error: ''
}
我认为共享一个是个坏主意,因为当同时获取和创建用户时,如果一个操作完成,通过将加载设置为false
,它可能会误导另一个操作也完成。然而,用例很少,也许我担心得太多了
我说得对吗?我认为“加载”或“错误”之类的数据不属于全局数据存储,而应该作为本地组件状态保存。它不是持久性的,其他组件不应该需要它。在全局数据存储中,我可能只放一个用户实体本身,因为它可能会被其他组件访问。如果您希望将加载状态保持在您的状态,那么最好使用计数器模式,而不是真/假标志
const loadingReducer = (state = 0, action) => {
if (action.type === 'LOADING_FOR_EDITING' ||
action.type === 'LOADING_FOR_CREATING' ||
...) {
return state + 1;
}
if (action.type === 'LOADING_FOR_EDITING_SUCCESS' ||
action.type === 'LOADING_FOR_CREATING_SUCCESS' ||
...) {
return state - 1;
}
return state;
};
// root reducer:
export default combineReducers({
loading: loadingReducer,
loadedData: loadedDataReducer,
// ...etc
});
现在,您可以在组件中检查加载状态,例如const isLoaded=state.loading==0代码>
这种方法允许您控制多个异步请求。它是数据结构智能化的。
到目前为止,我使用
{
targetState: {
data: [{id: 1...}, {id: 2} ... ],
loading: false,
loaded: false,
error: null,
... // you could put more information if you like, such activeTarget etc
}
}
如果存在更多嵌套数据,则需要考虑归一化状态形状。
希望这能有所帮助。除了null之外,“result”字段还包含什么?@MattiVirkkunen它可能是获取结果;或者创建请求响应“获取结果”与用户实体本身不同吗?@MattiVirkkunen noIn在这种情况下,我认为您的fetchingResult
应该被称为users
,并且是一个数组。我同意您的看法。但我阅读的每一篇redux教程似乎都将这三件事放在了一起。有没有其他教程实现了您所描述的方式?@hh54188我不知道有什么好的教程,但我想稍微考虑一下,很容易决定什么状态需要在所有东西之间共享,什么状态不需要共享。我不同意。React组件都是关于显示的,而不是关于数据管理的。这就是Redux的全部目的——将它们分开。组件用于显示,数据进入存储,容器组件将存储中的数据映射为视图组件所需的格式。如果将状态数据保存在组件中,则不需要重复使用。