Vue 实例有一个完整的生命周期,从开始建立到实例销毁整个过程,vue都提供了事件钩子,给咱们提供了执行自定义逻辑的机会。html
官网提供的生命周期图示:vue
例如,在实例挂载完成,模版中的html渲染到页面以后,能够经过mounted进行咱们自定义的事件:函数
var vm = new Vue({ data: { a: “实例挂载完成” }, mounted: function () { console.log(this.a) } })
生命周期钩子的使用方法就是在vue实例化的参数中,添加上mounted,beforeMount等方法。this
那么,他们到底是如何实现的呢?spa
查看vue源码,会发如今vue实例初始化(_init)、挂载($mount )等过程当中,都调用了一个叫callHook的方法,以下图:code
vue在处理生命周期的lifecycle.js(src/core/instance/lifecycle.js)中定义了一个callHook函数:htm
export function callHook (vm: Component, hook: string) { const handlers = vm.$options[hook] if (handlers) { for (let i = 0, j = handlers.length; i < j; i++) { try { handlers[i].call(vm) } catch (e) { handleError(e, vm, `${hook} hook`) } } } if (vm._hasHookEvent) { vm.$emit('hook:' + hook) } }
能够看出,vue实例在各个生命周期阶段,都会去调用钩子callHook,当options中有对应的内容时,就会去运行相关的方法。生命周期
例如上面的例子中,vue初始化的时候,会赋值给$options事件
vm.$options
以下图:ip
当执行callHook(vm, ‘mounted’)时,$options.mounted里边的方法就会执行
好比例子中的 console.log(this.a)