redux 源码解读-

这里直接贴代码:
export default function combineReducers(reducers) { // reducers : {}
  const reducerKeys = Object.keys(reducers) // 获得传进来对象的key
  const finalReducers = {} // 声明finalReducers 这用来存储最终的reducers
  for (let i = 0; i < reducerKeys.length; i++) { // 这个循环是用来筛选数据的。
    const key = reducerKeys[i] //获得key

    if (process.env.NODE_ENV !== 'production') { // 如果是生产环境
      if (typeof reducers[key] === 'undefined') { // 如果reducers[key] 是 undefinded 抛出错误
        warning(`No reducer provided for key "${key}"`)
      }
    }

    if (typeof reducers[key] === 'function') { // 筛选reducers【key】 如果是函数才保存
      finalReducers[key] = reducers[key]
    }
  }
  const finalReducerKeys = Object.keys(finalReducers) // 获得 finalReducers keys

  let unexpectedKeyCache
  if (process.env.NODE_ENV !== 'production') {
    unexpectedKeyCache = {}
  }

  let shapeAssertionError
  try {
    assertReducerShape(finalReducers) // 判断finalReducers的合法性。
  } catch (e) {
    shapeAssertionError = e
  }
// 这里返回一个函数。这个函数就是传入到createStore的函数。
  return function combination(state = {}, action) {
    console.log(shapeAssertionError);
    if (shapeAssertionError) {
      throw shapeAssertionError
    }

    if (process.env.NODE_ENV !== 'production') {
      const warningMessage = getUnexpectedStateShapeWarningMessage( // 判断数据的合法性
        state,
        finalReducers,
        action,
        unexpectedKeyCache
      )
      if (warningMessage) {
        warning(warningMessage)
      }
    }

    let hasChanged = false // 是否改变的flag
    const nextState = {} // 存储最终的state
    for (let i = 0; i < finalReducerKeys.length; i++) { // 遍历 finalReducerKeys
      const key = finalReducerKeys[i] // 获得key
      const reducer = finalReducers[key] // 获得对应的reducer
      const previousStateForKey = state[key] // 获得key对应的state
      const nextStateForKey = reducer(previousStateForKey, action) // 获得根据key 改变后的state
      if (typeof nextStateForKey === 'undefined') {
        const errorMessage = getUndefinedStateErrorMessage(key, action)
        throw new Error(errorMessage)
      }
      nextState[key] = nextStateForKey // 将改变后的key 存储到 nextState 对应的key
      hasChanged = hasChanged || nextStateForKey !== previousStateForKey // 判断是否改变,是否需要更新state
    }
    return hasChanged ? nextState : state // 如果改变了 返回新的state 没改变则返回旧state。
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值