Can you help me with exception Unexpected key "userName" found in preloadedState argument passed to createStore. Expected to find one of the known reducer keys instead: "default". Unexpected keys will be ignored.
I discovered this Link but it doesn't help me. I don't undestand something, maybe this part from documentation: plain object with the same shape as the keys passed to it
Can you exlain me my mistake on my example?
import React from "react";
import ReactDOM from "react-dom";
import { Provider } from 'react-redux';
import { createStore, combineReducers, applyMiddleware } from 'redux';
import App from './containers/App.jsx';
import * as reducers from './reducers'
import types from './constants/actions';
const reducer = combineReducers(reducers);
const destination = document.querySelector("#container");
var store = createStore(reducer, {
userName : ''
});
ReactDOM.render(
<Provider store={store}>
<App/>
</Provider>,
destination
);
console.log(1)
store.subscribe( ()=> {
console.log("-------------------------")
let s = store.getState()
console.log("STATE = " + s)
for (var k in s) {
if (s.hasOwnProperty(k)) {
console.log("k = " + k + "; value = " + s[k]);
}
}
})
store.dispatch({
type: types.LOAD_USER_NAME,
userName : "Oppps1"
})
my reducer:
import types from './../constants/actions'
export default function userNameReducer (state = {userName : 'N/A'}, action) {
console.log('inside reducer');
switch (action.type) {
case types.LOAD_USER_NAME:
console.log("!!!!!!!!!!!!!!!")
console.log("action.userName = " + action.userName)
for (var k in state) {
if (state.hasOwnProperty(k)) {
console.log("k = " + k + "; value = " + state[k]);
}
}
return action.userName;
default:
return state
}
}
result in console after execution:
TLDR: stop using
combineReducers
and pass your reducer tocreateStore
directly. Useimport reducer from './foo'
instead ofimport * from './foo'
.Example with default import/export, no
combineReducers
:Example with
combineReducers
The second argument of
createStore
(preloaded state) must have the same object structure as your combined reducers.combineReducers
takes an object, and applies each reducer that is provided in the object to the corresponding state property. Now you are exporting your reducer usingexport default
, which is transpiled to something likemodule.exports.default = yourReducer
. When you import the reducer, you getmodule.exports
, which is equal to{default: yourReducer}
. Your preloaded state doesn't have adefault
property thus redux complains. If you useimport reducer from './blabla'
you getmodule.exports.default
instead which is equal to your reducer.Here's more info on how ES6 module system works from MDN.
Reading combineReducers docs from redux may also help.
Or just: