Skip to content

生命周期

简介

对vue来讲,生命周期就是一个vue实例从创建到销毁的过程

作用

给予开发者在不同的生命周期阶段添加业务代码的能力。

原理和回调是一个概念,当系统执行到某处时,检查是否有hook(钩子),有的话就会执行回调。

几个阶段

  • beforeCreate:是 new Vue( ) 之后触发的第一个钩子,在当前阶段 data、methods、computed 以及 watch 上的数据和方法都不能被访问
  • create:在实例创建完成后发生,当前阶段已经完成了数据观测,也就是可以使用数据,更改数据,在这里更改数据不会触发 updated 函数。可以做一些初始数据的获取,在当前阶段无法与 DOM 进行交互,如果非要想,可以通过 vm.$nextTick 来访问 DOM
  • beforeMount:发生在挂载之前,在这之前 template 模板已导入渲染函数编译。而当前阶段虚拟 DOM 已经创建完成,即将开始渲染。在此时也可以对数据进行更改,不会触发 updated。
  • mount:在挂载完成后发生,在当前阶段,真实的 DOM 挂载完毕,数据完成双向绑定,可以访问到 DOM 节点,使用 $refs 属性对 DOM 进行操作
  • beforeUpdate:发生在更新之前,也就是响应式数据发生更新,虚拟 DOM 重新渲染之前被触发,你可以在当前阶段进行更改数据,不会造成重渲染
  • update:发生在更新完成之后,当前阶段组件 DOM 已完成更新。要注意的是避免在此期间更改数据,因为这可能会导致无限循环的更新
  • beforeDestroy:发生在实例销毁之前,在当前阶段实例完全可以被使用,我们可以在这时进行善后收尾工作,比如清除计时器。
  • destroyed:发生在实例销毁之后,这个时候只剩下了 DOM 空壳。组件已被拆解,数据绑定被卸除,监听被移出,子实例也统统被销毁

父子组件生命周期顺序

  • 加载渲染过程:父beforeCreate -> 父created -> 父beforeMount -> 子beforeCreate -> 子created -> 子beforeMount -> 子mounted -> 父mounted
  • 子组件更新过程:父beforeUpdate -> 子beforeUpdate -> 子updated -> 父updated
  • 父组件更新过程:父beforeUpdate -> 父updated
  • 销毁过程:父beforeDestroy -> 子beforeDestroy ->子destroyed -> 父destroyed

请求一般在那个生命周期

一般在 created、beforeMount、mounted 中进行调用,因为在这三个钩子函数中,data 已经创建,可以将服务端端返回的数据进行赋值。更多是在 created

  1. 能更快获取到服务端数据,减少页面 loading 时间
  2. SSR 不支持 beforeMount 、mounted 钩子函数,所以放在 created 中有助于代码的一致性
  3. reated 是在模板渲染成 html 前调用,即通常初始化某些属性值,然后再渲染成视图。如果在 mounted 钩子函数中请求数据可能导致页面闪屏问题