Vue2源码解析-optionMergeStrategies

332 阅读2分钟

optionMergeStrategies

自定义合并策略的选项。

  • 类型:Function
  • 默认值:{}
  • 用法:
// 在optionMergeStrategies对象上添加一个属性tip,tip必须是一个函数或者假值(false)
Vue.config.optionMergeStrategies.tip = function (parent, child, vm{
  return parent + '----' + child
}
/**
  Vue.options的默认值:
  Vue.options = {
     'components': { /.../ },
     'directives': { /.../ },
     filters: { / ... / },
     _base: function Vue() { }
  }
*/
Vue.options.tip = '我是全局最顶层的Options'

var vue = new Vue({
  el'#app',
  data: { }
})

var Child = Vue.extend({
  tip'我是子组件'
})
// => Child.options.tip = '我是全局最顶层的Options----我是子组件'
  • 核心源码:
var config = ({
  // ...
  optionMergeStrategiesObject.create(null),
  // ...
})
var strats = config.optionMergeStrategies;
var hasOwnProperty = Object.prototype.hasOwnProperty;
// 判断对象是否包含特定的自身(非继承)属性。
function hasOwn(obj, key) {
  return hasOwnProperty.call(obj, key)
}

// 默认合并策略函数
var defaultStrat = function (parentVal, childVal) {
  return childVal === undefined
    ? parentVal
    : childVal
}

/**
 * 合并options函数
 */
function mergeOptions(parent, child, vm) {
  // ...
  var options = {};
  var key;
  for (key in parent) {
    mergeField(key);
  }
  for (key in child) {
    if (!hasOwn(parent, key)) { // 父组件中已有该属性时,避免重复执行合并字段
      mergeField(key);
    }
  }
  function mergeField(key) {
    // strats[key]自定义合并策略
    // 举个栗子:
    // 当key为data时,start = strats.data = function () { //... }
    // 如果没有strats[key]不存在,则使用默认的defaultStrat合并策略  
    var strat = strats[key] || defaultStrat; // 如果tip为假,则strat为defaultStrat
    options[key] = strat(parent[key], child[key], vm, key); // 这就是为什么tip必须为函数的原因
  }
  return options
}

附录:github.com/fanqiewa/vu…