vue 源码分析之 mixins
mixin 的使用
mixins实现
export function mergeOptions(
parent: Object,
child: Object,
vm?: Component
): Object {
...
// 如果有 child.extends 递归调用 mergeOptions 实现属性拷贝
const extendsFrom = child.extends
if (extendsFrom) {
parent = mergeOptions(parent, extendsFrom, vm)
}
// 如果有 child.mixins 递归调用 mergeOptions 实现属性拷贝
if (child.mixins) {
for (let i = 0, l = child.mixins.length; i < l; i++) {
parent = mergeOptions(parent, child.mixins[i], vm)
}
}
// 申明 options 空对象,用来保存属性拷贝结果
const options = {}
let key
// 遍历 parent 对象,调用 mergeField 进行属性拷贝
for (key in parent) {
mergeField(key)
}
// 遍历 child 对象,调用 mergeField 进行属性拷贝
for (key in child) {
if (!hasOwn(parent, key)) {
mergeField(key)
}
}
// 属性拷贝实现方法
function mergeField(key) {
// 穿透赋值,默认为 defaultStrat
const strat = strats[key] || defaultStrat
options[key] = strat(parent[key], child[key], vm, key)
}
return options
}
extends
最后更新于