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);
};