Redux:通过带有减速器和存储增强器组合的预加载状态

Inq*_*irl 5 reactjs react-router redux redux-form react-redux

我创建了一个带有reducer和Enhancer功能的redux存储。

    const store = createStore(rootReducer, compose(
      applyMiddleware(thunk),
      DevTools.instrument()
    ))
Run Code Online (Sandbox Code Playgroud)

rootReducer使用combinedReducers创建单个根减速器。我想在存储中初始化窗口的位置值,所以我尝试了如下操作:

 const initialWindowLocation = window.location.hostname
 const store = createStore(rootReducer, initialWindowLocation, compose(
      applyMiddleware(thunk),
      DevTools.instrument()
 ))
Run Code Online (Sandbox Code Playgroud)

我将商店连接到redux表单,并且能够通过mapStateToProps获取所有reducer的值,但是我一直试图从redux createStore访问简单的字符串值(即,initialWindowWindowLocation)。有一些我缺少的Redux技巧吗?

另外,如果我尝试遇到意外的关键错误:

 Unexpected key found in previous state received by the reducer.
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?提前致谢。

RIY*_*HAN 5

根据这里的 redux 文档

createStore(reducer, [preloadedState], [enhancer])

[preloadedState](任意):初始状态。您可以选择指定它来混合通用应用程序中服务器的状态,或恢复以前序列化的用户会话。如果您使用combineReducers 生成了reducer,则它必须是一个普通对象,其形状与传递给它的键相同。否则,您可以自由地传递您的减速器可以理解的任何内容。

最好再创建一个减速器。

const window = ( state = window.location.hostname,action )=>state;
Run Code Online (Sandbox Code Playgroud)

并将其添加到combineReducers列表中。

编辑 :

我想知道为什么将普通对象作为第二个参数传递给 createStore 不起作用

假设你的 rootReducer 看起来像这样。

const window = (state = { location: "test" }, action) => state;
const user = (state = "", action) => state;
const rootReducer = combineReducers({ window, user });
Run Code Online (Sandbox Code Playgroud)

当您说“将普通对象作为第二个参数传递给 createStore”时,其含义preloadedstate应该与减速器默认状态匹配。

preloadedstate = { user: [], window: { location: "windowone" }}`

const store = createStore(rootReducer, { user: [], window: { location: "windowone" } }, applyMiddleware(...middleWare));
Run Code Online (Sandbox Code Playgroud)

否则,你会得到一个错误Unexpected key found in previous state received by the reducer.,因为在减速器中没有定义这样的键。