使用CombineReducers时设置减速器及其子减速器的状态

时间:2019-02-15 22:17:19

标签: reactjs redux normalizr redux-immutable

我正在扩展仅本地的React应用程序的功能,以连接到API。这是重构前的代码。您会看到我正在从全局窗口变量INIT_STATE设置初始状态,该变量还包括其他一些根级别的对象。

我专注于这些根级对象之一,称为“项目”。

对于项目reducer,我正在规范化(使用normalizr)这样的状态,并组合reducer以获取归一化实体的use reducer:

window.PROJECTS_STATE = fromJS(normalize(window.INIT_STATE.projects, projectsSchema));

const result = (state = window.PROJECT_STATE.get('result'), action) => {
  switch (action.type) {
    default:
      return state;
  }
};

// In these reducers, currently, I'm getting init_state from window.PROJECTS_STATE
// i.e. window.PROJECT_STATE.entities.projects), which has been normalized above
const entities = combineReducers({
  projects,
  items,
  events,
});


// Here is where I'd like to handle an action to normalize and 
// overwrite the state of `projects` and all it's sub-reducers
export default () => combineReducers({
  entities,
  result,
});

在重构中,我已经调度了一些动作来在我的顶级容器中获取和接收API请求。通过处理那些化简器中的操作GET_REQUEST_SUCCESS以返回那部分响应,我可以轻松地设置INIT_STATE中其他根级别对象的初始状态,但是由于projects被规范化了并且具有嵌套的子归约器,我不确定如何使用CombineReducers来设置此状态。

所以最终,我希望能够合并化简器,同时还要处理一个可以覆盖其所有子化简器状态的动作。这是可能的还是有更好的方法来解决这个问题?

非常感谢。

1 个答案:

答案 0 :(得分:0)

从我看到的结果来看,要保留并重新保存一些已保存状态为化简状态,Redux persist是为此目的专门设计的,您可以设置blacklist或{ {1}}对于要为其保存状态或不为其保存状态的每个化简器,这可以帮助您完成所需的工作。

但是,如果您仍然想一口气恢复整个树的状态,恐怕不可能(据我所知),这有点违背了redux的功能本质(没有任何方面,效果),从高级别的减速器中修改所有减速器的状态是一个很大的副作用,whitelist仅仅是捆绑打包的减速器,但从逻辑上讲,它们(应该)都保持解耦。 / p>

话虽如此,您可以尝试在每个化简器处理之前在middleware中修改您的操作,但是并没有绕过combineReducers并且所有化简器都获得所有操作的事实,即有点儿redux试图解决的整个问题,绕开它会使库的意义无效。