深入剖析Vue源码 - 选项合并(下)

上一节的末尾,我们介绍了Vue中处理合并选项的思路,概括起来主要有两点,一是当选项存在定义好的默认配置策略时,优先选择默认配置策略,并且根据不同的配置项来合并子父选项; 二是当传入选项不存在默认策略时,处理的原则是有子类配置选项则默认使用子类配置选项,没有则选择父类配置选项。vue中,大部分选项都有其自定义策略,因此本节分析的重点也放在了各种自定义配置策略中(内置资源选项,生命周期钩子选项,el, data, watch, props等)。

首先还是回顾一下选项合并的代码,strat这个对象包含了所以自定义的默认策略。

  1. function mergeOptions ( parent, child, vm ) {
  2. ···
  3. var options = {};
  4. var key;
  5. for (key in parent) {
  6. mergeField(key);
  7. }
  8. for (key in child) {
  9. if (!hasOwn(parent, key)) {
  10. mergeField(key);
  11. }
  12. }
  13. function mergeField (key) {
  14. var strat = strats[key] || defaultStrat; // 如果有自定义选项策略,则使用自定义选项策略,否则选择子类配置选项
  15. options[key] = strat(parent[key], child[key], vm, key);
  16. }
  17. return options
  18. }