【问题标题】:Modify react-boilerplate to nest injected reducers under a single key of the store修改 react-boilerplate 以在 store 的单个键下嵌套注入的 reducer
【发布时间】:2018-03-29 20:20:54
【问题描述】:

react-boilerplate 有一个实用程序injectReducer,用于允许reducer 异步附加到store,并且在整个应用程序的reducers.js 文件中,createReducer 散布这些injectedReducers进入状态,使您具有如下状态形状:

{
  route: routeReducer,
  language: languageProviderReducer,
  container1: container1Reducer,
  container2: container2Reducer,
  container3: container3Reducer,
}

我想将这些特定于容器的 reducer 分散到全局状态的子键中,如下所示:

{
  route: routeReducer,
  language: languageProviderReducer,
  ui: {
    container1: container1Reducer,
    container2: container2Reducer,
    container3: container3Reducer,
  }
}

我天真地尝试像这样修改reducers.js方法createReducer

export default function createReducer(injectedReducers) {
  return combineReducers({
    route: routeReducer,
    language: languageProviderReducer,
    ui: (injectedReducers) ? combineReducers(injectedReducers) : ((state = {}) => state),
  });
}

或者也许:

export default function createReducer(injectedReducers) {
  return combineReducers({
    route: routeReducer,
    language: languageProviderReducer,
    ui: combineReducers(injectedReducers || {}),
  });
}

但是现在当我尝试加载任何容器时,我得到一个错误:TypeError: Cannot read property '_currentElement' of null

使用注入的 reducer 和 react-boilerplate 实现我想要的那种状态形状的最简单途径是什么?

【问题讨论】:

  • 你有没有尝试在你注入的reducer中state = null,然后在reducer函数的末尾return state
  • 不,我注入的减速器在注入 react-boilerplate 的正常方式时工作正常,通过在 combineReducers 中传播
  • @tacos_tacos_tacos 你有没有找到解决办法?你最后做了什么?
  • @nikjohn 是的,我做到了...我会在下面写一个答案。

标签: javascript reactjs redux react-boilerplate


【解决方案1】:

我认为关键是只在需要时添加 ui 键(当至少存在一个 injectedReducers 时)。

/**
 * Creates the main reducer with the dynamically injected ones
 */
export default function createReducer(injectedReducers) {
  const reducersToCombine = {
    form: formReducer,
    language: languageProviderReducer,
    route: routeReducer,
  };

  if (injectedReducers && Object.keys(injectedReducers).length > 0) {
    reducersToCombine.ui = combineReducers(injectedReducers);
  }

  return combineReducers(reducersToCombine);
}

【讨论】:

  • 做到了,并意识到如果我将相同的减速器附加到几个键上,例如 { forms : {id1 : reducer, id2: reducer}} 我还需要 在行动现在我有两个处理相同动作的减速器。尽管它们会改变状态的单独部分,但如果没有 id 在动作中,两者都可能会在特定于具体 id 的一个动作上发生变异。
猜你喜欢
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多