combineReducers解读

当使用多个模块的时候,可以使用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;
    };
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值