1.定义全局Mixin函数

1
2
3
4
5
6
7
8
9
10
import {mergeOptions} from '../util/index'
export default function initMixin(Vue){
Vue.mixin = function (mixin) {
// 合并对象
this.options=mergeOptions(this.options,mixin)
};
}
};

initMixin(Vue);//在Vue的入口文件引入initMixin方法

2.mergeOptions方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//先定义生命周期,合并生命周期,然后为生命周期队列添加合并方法
//mixin核心方法
export function mergeOptions(parent, child) {
const options = {};
// 遍历父亲
for (let k in parent) {
mergeFiled(k);
}
// 父亲没有 儿子有
for (let k in child) {
if (!parent.hasOwnProperty(k)) {
mergeFiled(k);
}
}

//真正合并字段方法
function mergeFiled(k) {
if (strats[k]) {
options[k] = strats[k](parent[k], child[k]);
} else {
// 默认策略
options[k] = child[k] ? child[k] : parent[k];
}
}
return options;
}

主要是遍历父亲和儿子的属性,进行合并,选项有自己的合并策略直接调用。
这里的生命周期的合并策略mergeHook明显把全部生命周期各自混入成了数组的形式依次调用


3.生命周期的调用

1
2
3
4
5
6
7
8
9
export function callHook(vm, hook) {
// 依次执行生命周期对应的方法
const handlers = vm.$options[hook];
if (handlers) {
for (let i = 0; i < handlers.length; i++) {
handlers[i].call(vm); //生命周期里面的this指向当前实例
}
}
}

init初始化的时候调用mergeOptions来进行选项合并,然后在生命周期(在mountComponent方法)的地方运用callHook来执行用户传入的相关方法


4.小结

mixin混入主要是将混入的对象与options合并,在各自的生命周期中调用。