getReducer

概述

getReducer 用于根据 model.reducers 生成 redux reducer,它在 dva-core/src/index.js 中的 start 和 injectModel 方法被调用,详情可以看这里

源码地址

dva/packages/dva-core/src/getReducer.js

解析

可以看到 getReducer 方法会处理两种情况:

  • reducers 为数组:reducers 为数组时可以支持 enhancer,格式就像注释里写的一样:[realReducers, enhancer]
  • reducers 为对象:这种就是我们常用的格式 无论是 array 还是 object,最终生成 reducer 都是通过 (handleActions || defaultHandleActions)(reducers, state) handleActions 参数如果没有就用 dva 内部提供的 defaultHandleActions 然后传入 reducers 和 初始状态。

提示

defaultHandleActions 的相关解析可以看这里

import defaultHandleActions from './handleActions';

export default function getReducer(reducers, state, handleActions) {
  // Support reducer enhancer
  // e.g. reducers: [realReducers, enhancer]
  if (Array.isArray(reducers)) {
    return reducers[1](
      (handleActions || defaultHandleActions)(reducers[0], state)
    );
  } else {
    return (handleActions || defaultHandleActions)(reducers || {}, state);
  }
}