combineReducers报错求助

#1

本来使用一个reducer没问题,现在需要两个reducer。所以要用combineReducers合并,但是报错了。
本来是这样没错的。
const store=createStore(lineReducer,lineOption,applyMiddleware(thunk));
多一个reducer就报错了。
const reducer = combineReducers({a:lineReducer,b:sellersReducer}); const state={a:lineOption,b:null}; const store=createStore(reducer ,state,applyMiddleware(thunk));

我查了后测试combineReducers,发现只有用combineReducers一个reducer也报错,下面这样:
const store=createStore(combineReducers({a:lineReducer}),{a:lineOption},applyMiddleware(thunk));

请问这是为什么啊,看教程也是这样的

#2

这是combineReducers两个的报错。

combineReducers一个reducer报的错是找不到相应资源

#3

reducer必须返回对象,根据type执行对象的语句的switch函数,你直接break了吧,没有return,或者return返回的不是object。所以报错
因为redux初始化reducer会默认传入几个随机的action,用来检测你reducer的返回值是否是undefined,如果是,reducer就会提示你。用来确保reducer的正常工作!
你检查下你的reducer的写法就好了,确保返回的类型都是object类型。一种便利的解决方案就是在reducer的第一个参数里指定默认值比如:

function pageAReducer( state = {} , action ){
   switch( action.type ){
      case 'actionA':
             return state ;
      default:                     // default 确保没有匹配的action.type的时候,保证了pageAReducer返回值正确而不是undefined
             return state ;
   }
}

另外你把你的报错copy到google,第一条就是答案了:Why do I get “Reducer […] returned undefined during initialization” despite providing initialState to createStore()? redux的作者自己的回答。

#4

谢谢。google那条看不太懂,我debugger后发现reducer之后获取传过来的值方式变了。
之前是通过:this.props.line 获取,现在我用this.props.a.line 获取到了(a是combineReducers中一个reducer的key)。
应该是因为combineReducers导致多了一层。

#5

可能我没解释清楚吧,重点是默认值,reducer参数中的第一个state参数,应该有个默认的值。看我的pageAReducer( state={} , action ) 这句是当没有state的时候,给state一个默认的空对象。