生命周期钩子选项的合并策略
上篇文章我们说完strats.data 这篇我们介绍生命周期钩子选项:
function mergeHook (
parentVal: ?Array<Function>,
childVal: ?Function | ?Array<Function>
): ?Array<Function> {
return childVal
? parentVal
? parentVal.concat(childVal)
: Array.isArray(childVal)
? childVal
: [childVal]
: parentVal
}
LIFECYCLE_HOOKS.forEach(hook => {
strats[hook] = mergeHook
})
这是用来合并生命周期钩子的,先看看forEach语句:
使用 forEach
遍历 LIFECYCLE_HOOKS
常量,那说明这个常量应该是一个数组, 我们再来看看
LIFECYCLE_HOOKS常量是什么
export const LIFECYCLE_HOOKS = [
'beforeCreate',
'created',
'beforeMount',
'mounted',
'beforeUpdate',
'updated',
'beforeDestroy',
'destroyed',
'activated',
'deactivated',
'errorCaptured'
]
LIFECYCLE_HOOKS
常量实际上是由与生命周期钩子同名的字符串组成的数组
forEach
语句,它的作用就是在 strats
策略对象上添加用来合并各个生命周期钩子选项的策略函数,并且这些生命周期钩子选项的策略函数相同:都是 mergeHook
函数
return childVal
? parentVal
? parentVal.concat(childVal)
: Array.isArray(childVal)
? childVal
: [childVal]
: parentVal
mergeHook
函数内部处理操作,整体上是由三元运算符构成
return (是否有 childVal,即判断组件的选项中是否有对应名字的生命周期钩子函数)
? 如果有 childVal 则判断是否有 parentVal
? 如果有 parentVal 则使用 concat 方法将二者合并为一个数组
: 如果没有 parentVal 则判断 childVal 是不是一个数组
? 如果 childVal 是一个数组则直接返回
: 否则将其作为数组的元素,然后返回数组
: 如果没有 childVal 则直接返回 parentVal
也就是说判断子选项和父选项是否有,然后进行对应的处理,
如果子选项和父选项都有 则合并成为一个数组 等。。。。
它判断是否有 childVal
,即组件的选项是否写了生命周期钩子函数,如果没有则直接返回了 parentVal
如果有 parentVal
那么其一定是数组,如果没有 parentVal
那么 strats[hooks]
函数根本不会执行
接下来看看几种实例:更加明确的学习生命周期选项策略:
new Vue({
created: function () {
console.log('created')
}
})
strats.created
策略函数来讲 ,created就是childVal,它是一个函数。parentVal
应该是 Vue.options.created
,但 Vue.options.created
是不存在的,所以最终经过 strats.created
函数的处理将返回一个数组:
options.created = [
function () {
console.log('created')
}
]
看下一个例子:
const Parent = Vue.extend({
created: function () {
console.log('parentVal')
}
})
const Child = new Parent({
created: function () {
console.log('childVal')
}
})
Child 是通过new parent生成的 Child 就是childVal, Parent 就是parentVal
childVal:
created: function () {
console.log('childVal')
}
parentVal:(
Parent.options.created)
Parent.options.created = [
created: function () {
console.log('parentVal')
}
]
这个例子有 childVal
,又有 parentVal,根据
mergeHooks
函数:
parentVal.concat(childVal)
,将 parentVal
和 childVal
合并成一个数组
created: function () {
console.log('parentVal')
},
created: function () {
console.log('childVal')
}
]
Array.isArray(childVal)]?
这一段三元运算代表什么?
说明vue 生命周期钩子是可以写成数组的,是不是很惊讶 很神奇,从未有过的姿势,如此的爽!
new Vue({
created: [
function () {
console.log('first')
},
function () {
console.log('second')
},
function () {
console.log('third')
}
]
})
vue源码读起来真鸡儿爽!!!
几天没更了 加班到脑壳痛。。。