【发布时间】:2019-07-10 02:19:02
【问题描述】:
我正在扩展仅限本地的 React 应用程序的功能以连接到 API。这是我重构之前的代码。您会看到我正在从全局窗口变量 INIT_STATE 设置初始状态,该变量还包括一些其他根级对象。
我专注于这些根级对象之一,称为“项目”。
对于reducer项目,我正在规范化(使用normalizr)这样的状态,并结合reducer来为规范化的实体使用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 已标准化并嵌套了子-reducers,我不确定如何使用 combineReducers 设置此状态。
所以最终,我希望能够组合减速器,同时处理一个可以覆盖其所有子减速器状态的操作。这是可能的还是有更好的方法来解决这个问题?
非常感谢。
【问题讨论】:
-
到底是什么问题?即使你有嵌套的减速器,组合减速器应该只打包所有的减速器,动作仍然应该分派给所有的减速器,不管子嵌套
-
@ospfranco 问题是我不想在每个减速器级别处理操作。我需要为 API 响应的项目部分标准化数据。我想在项目减速器的一个动作中只做一次。如果我不必使用 combineReducers 这会很简单,但我不知道如何让这个更高级别的 reducer 在组合子 reducer 的同时采取行动。
标签: reactjs redux normalizr redux-immutable