【问题标题】:Set state of reducer and its sub-reducers when using combineReducers使用 combineReducers 时设置 reducer 及其子 reducer 的状态
【发布时间】: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


【解决方案1】:

据我所知,您想要的是持久化一些保存的状态并将其重新水合到您的减速器状态中,Redux persist 专门为此目的而设计,您可以为每个设置一个 blacklistwhitelist你想要保存状态或不保存状态的reducer,这可能会帮助你完成你想要的。

但是,如果您仍然想一次性恢复整棵树的状态,恐怕这可能是不可能的(据我所知),这有点违背 redux 的功能性质(没有侧面-效果),从高级 reducer 修改所有 reducer 的状态是一个很大的副作用,combineReducers 只不过是将 reducer 打包成一个包,但从逻辑上讲,它们都(应该)保持解耦。

话虽如此,您可以在每个 reducer 处理它之前尝试在 middleware 中修改您的操作,但无法绕过 reducer -> catch action -> new state 和所有 reducer 获得所有操作的事实,这有点像整个问题redux 试图解决,绕过它会使库的点无效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-31
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 2018-11-14
    相关资源
    最近更新 更多