理解vue的生命周期钩子

Vue 实例有一个完整的生命周期,从开始建立到实例销毁整个过程,vue都提供了事件钩子,给咱们提供了执行自定义逻辑的机会。html

官网提供的生命周期图示:vue

clipboard.png

例如,在实例挂载完成,模版中的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

clipboard.png

clipboard.png

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事件

clipboard.png

vm.$options以下图:ip

clipboard.png

当执行callHook(vm, ‘mounted’)时,$options.mounted里边的方法就会执行

好比例子中的 console.log(this.a)

相关文章
相关标签/搜索