我正在扩展仅本地的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来设置此状态。
所以最终,我希望能够合并化简器,同时还要处理一个可以覆盖其所有子化简器状态的动作。这是可能的还是有更好的方法来解决这个问题?
非常感谢。
答案 0 :(得分:0)
从我看到的结果来看,要保留并重新保存一些已保存状态为化简状态,Redux persist是为此目的专门设计的,您可以设置blacklist
或{ {1}}对于要为其保存状态或不为其保存状态的每个化简器,这可以帮助您完成所需的工作。
但是,如果您仍然想一口气恢复整个树的状态,恐怕不可能(据我所知),这有点违背了redux的功能本质(没有任何方面,效果),从高级别的减速器中修改所有减速器的状态是一个很大的副作用,whitelist
仅仅是捆绑打包的减速器,但从逻辑上讲,它们(应该)都保持解耦。 / p>
话虽如此,您可以尝试在每个化简器处理之前在middleware中修改您的操作,但是并没有绕过combineReducers
并且所有化简器都获得所有操作的事实,即有点儿redux试图解决的整个问题,绕开它会使库的意义无效。