prefixNamespace

概述

prefixNamespace 方法的作用是给传入的 model 的 effects 和 reducers 添加前缀:${namespace}${NAMESPACE_SEP},它在 core.create() 方法里面调用。

源码地址

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

解析

prefixNamespace

我们看到 prefixNamespace 方法接收 model 对象并对齐进行结构,然后分别对 reducers 和 effects 进行处理。

  • reducers: reducers 有两种数据类型:数组和对象,所以要先判断是哪种数据类型,然后将获取到的 reducers 对象、namespace、'reducer' 三个参数传递给 prefix 方法,将结果重新赋值给 model.reducers
  • effects: 直接调用 prefix 方法
  • 最终将 model 返回
export default function prefixNamespace(model) {
  const {
    namespace,
    reducers,
    effects,
  } = model;

  if (reducers) {
    if (isArray(reducers)) {
      model.reducers[0] = prefix(reducers[0], namespace, 'reducer');
    } else {
      model.reducers = prefix(reducers, namespace, 'reducer');
    }
  }
  if (effects) {
    model.effects = prefix(effects, namespace, 'effect');
  }
  return model;
}

prefix

prefix 方法对传入的 obj 取其 keys 进行 reduce 操作,在遍历函数中做了如下操作:

  • 判断 key 是否已经添加了前缀,如果添加了则报错
  • 如果没添加就给 memo(新创建的空对象) 添加带前缀的属性和值
  • 最后返回 memo
function prefix(obj, namespace, type) {
  return Object.keys(obj).reduce((memo, key) => {
    warning(
      key.indexOf(`${namespace}${NAMESPACE_SEP}`) !== 0,
      `[prefixNamespace]: ${type} ${key} should not be prefixed with namespace ${namespace}`,
    );
    const newKey = `${namespace}${NAMESPACE_SEP}${key}`;
    memo[newKey] = obj[key];
    return memo;
  }, {});
}