data

strats对象上添加data方法,接收三个参数parentValchildValvm(可不传),返回一个对象

strats.data = function (
  parentVal: any,
  childVal: any,
  vm?: Component
): ?Function {
  if (!vm) {
    if (childVal && typeof childVal !== 'function') {
      process.env.NODE_ENV !== 'production' && warn(
        'The "data" option should be a function ' +
        'that returns a per-instance value in component ' +
        'definitions.',
        vm
      )
      return parentVal
    }
    return mergeDataOrFn(parentVal, childVal)
  }

  return mergeDataOrFn(parentVal, childVal, vm)
}

代码分析:

  1. 接收三个参数:parentValchildValvm(可不传)

  2. 如果第三个参数vm存在,返回mergeDataOrFn(parentVal, childVal, vm)

    否则,进入下一个判断,如果childVal存在并且childVal不是一个函数,返回 parentVal

    否则,返回mergeDataOrFn(parentVal, childVal)

接下来,分析mergeDataOrFn方法

分析:

  1. 如果没有传入vm,对parentVal,childVal两个参数的存在与否进行判断:

    如果childVal不存在返回parentVal

    如果parentVal不存在返回childVal

    如果两个值都存在返回合并函数 mergeData

  2. 如果传入vm,对parentVal,childVal两个参数的是不是函数类型进行判断:

    如果childVal是函数,直接执行该函数拿到返回值,否则,返回childVal并存到变量 instanceData

    parentVal同理,存到变量 defaultData中;

    如果 instanceData 存在,直接返回合并函数 mergeData并传入参数instanceDatadefaultData

    否则,直接返回defaultData

在上面多次提到函数mergeData,那么这个函数的又是做什么的呢:

经过分析可以看出,

作用:合并两个对象,将源对象from合并到目标对象to,并返回目标对象to

过程:对比两个对象,将两个对象不同的key及对应的value合并到目标对象to上,有相同的key的情况,使用目标对象to的key及对应的value

Last updated

Was this helpful?