Reactjs 注入异步还原程序时的预加载状态

Reactjs 注入异步还原程序时的预加载状态,reactjs,redux,react-boilerplate,Reactjs,Redux,React Boilerplate,如何能够同时具有预加载状态(从服务器水合)和动态注入还原剂 在react样板文件中或者有一个减速机的概念,它是根据您正在查看的页面/组件动态添加的。摘自reducers.js: export default function createReducer(asyncReducers) { return combineReducers({ users, posts, ...asyncReducers }); } 虽然这在从一个页面导航到另一个页面(或仅在客户端应用程

如何能够同时具有预加载状态(从服务器水合)和动态注入还原剂

react样板文件中
或者有一个减速机的概念,它是根据您正在查看的页面/组件动态添加的。摘自
reducers.js

export default function createReducer(asyncReducers) {
  return combineReducers({
    users,
    posts,
    ...asyncReducers
  });
}
虽然这在从一个页面导航到另一个页面(或仅在客户端应用程序上)时效果良好;从服务器获取数据时,我遇到以下错误:

在还原程序收到的以前状态中发现意外属性“注释”。期望找到一个已知的reducer属性名:“users”、“posts”。意外属性将被忽略。

(其中
comments
是动态注入的减速器的属性名称)


此错误的原因很清楚,因为来自服务器(使用React SSR)的
预加载状态
已经包含
注释
,并且初始缩减器没有,因为这是在之后动态添加的。如果我将
注释添加到我的
组合减速机
,错误就会消失;然而,这意味着在应用程序初始化时,我需要包括所有减速器;这并不理想。

您应该能够使用虚拟减速器代替动态加载的减速器,当加载真实减速器时,动态加载的减速器将被替换

{ comments: (state = null) => state }
这也可以自动完成,具体取决于您的实现,如

// Preserve initial state for not-yet-loaded reducers
const combine = (reducers) => {
  const reducerNames = Object.keys(reducers);
  Object.keys(initialState).forEach(item => {
    if (reducerNames.indexOf(item) === -1) {
      reducers[item] = (state = null) => state;
    }
  });
  return combineReducers(reducers);
};