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)
有什么想法吗?提前致谢。
根据这里的 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.,因为在减速器中没有定义这样的键。
| 归档时间: |
|
| 查看次数: |
3164 次 |
| 最近记录: |