当使用多个模块的时候,可以使用combineReducers函数实现最终合并
//使用
let reducer = combineReducers({
menu,
login
});
具体写在注释上面
function combineReducers(reducers) {
//reducerKeys 把reducer对象的属性名,并生成数组
var reducerKeys = Object.keys(reducers);
var finalReducers = {};
for (var i = 0; i < reducerKeys.length; i++) {
var key = reducerKeys[i];
if (process.env.NODE_ENV !== 'production') {
if (typeof reducers[key] === 'undefined') {
warning("No reducer provided for key \"" + key + "\"");
}
}
if (typeof reducers[key] === 'function') {
//如果reducers对象的属性值是函数,才放入reducer
finalReducers[key] = reducers[key];
}
}
var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same
// keys multiple times.
var unexpectedKeyCache;
if (process.env.NODE_ENV !== 'production') {
unexpectedKeyCache = {};
}
var shapeAssertionError;
try {
assertReducerShape(finalReducers);
} catch (e) {
shapeAssertionError = e;
}
//返回的函数最终放入createStore
return function combination(state, action) {
if (state === void 0) {
state = {};
}
if (shapeAssertionError) {
throw shapeAssertionError;
}
//判断是否是生产环境
if (process.env.NODE_ENV !== 'production') {
var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);
if (warningMessage) {
warning(warningMessage);
}
}
var hasChanged = false;
var nextState = {};//存放新的state值
for (var _i = 0; _i < finalReducerKeys.length; _i++) {
//最后合并的reducers对象的key
var _key = finalReducerKeys[_i];
//获取对应的reducer
var reducer = finalReducers[_key];
//获取对应的state值
var previousStateForKey = state[_key];
//获取最新的state
var nextStateForKey = reducer(previousStateForKey, action);
if (typeof nextStateForKey === 'undefined') {
var errorMessage = getUndefinedStateErrorMessage(_key, action);
throw new Error(errorMessage);
}
nextState[_key] = nextStateForKey;
//判断是否原来的state和修改过后的state相等
hasChanged = hasChanged || nextStateForKey !== previousStateForKey;
}
//获取属性值的长度和新的是否相等
hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;
//是否修改过返回最新的state
return hasChanged ? nextState : state;
};
}