Reactjs 混淆react redux减速器状态设计

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:

例如,我有一个reducer来操作用户状态,比如创建用户、编辑、获取用户

我是否应该为每个操作创建状态,如:

{
  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的全部目的——将它们分开。组件用于显示,数据进入存储,容器组件将存储中的数据映射为视图组件所需的格式。如果将状态数据保存在组件中,则不需要重复使用。