【VUE】生命周期

219 阅读3分钟

(一)说说vue的生命周期?⭐⭐⭐⭐⭐

总共分为 8 个阶段创建前/后,载入前/后,更新前/后,销毁前/后

  • 创建前/后:(数据data和Method的差别)

    • beforeCreate
      创建之前,此时还没有data和Method,vue实例的挂载元素el和数据对象data都是undefined,还没有初始化。
    • created
      • 创建完成,此时data和Method可以使用了(请求数据data),可以访问里面的数据和方法
      • 未挂载到DOM,el还没有, 在Created之后beforeMount之前如果没有el选项的话那么此时生命周期结束,停止编译,如果有则继续
  • 载入前/后:(虚拟DOM节点的差别)

    • beforeMount
      在渲染之前,vue实例的el和data都初始化了,但是挂载之前为虚拟的dom节点
    • mounted
      • vue实例挂载到真实DOM上,数据完成双向绑定,页面已经渲染完成,并且vm实例中已经添加完$el了,已经替换掉那些DOM元素了(双括号中的变量),这个时候可以操作DOM了 ,可以使用$refs 属性对 Dom 进行操作。
      • 但是是获取不了元素的高度等属性的,如果想要获取,需要使用nextTick()
      • mounted不会保证所有的子组件也都一起被挂载。如果要等到整个视图都渲染完毕,等子组件完全挂载之后再执行操作。可以在mounted内部使用 vm.$nextTick
  • 更新前/后:(新旧DOM)

    • beforeUpdate
      • 响应式数据更新时调用,发生在虚拟DOM打补丁之前,
      • 适合在更新之前访问现有的DOM,比如手动移除已添加的事件监听器
    • updated
      • data改变后,对应的组件重新渲染完成,
      • 避免在这个钩子函数中操作数据,防止死循环
  • 销毁前/后:(监听事件)

    • beforeDestroy
      • 实例销毁前调用,实例还可以用,this能获取到实例
      • 常用于销毁定时器,解绑事件
    • destroyed:实例销毁后调用,调用后所有事件监听器会被移除,所有的子实例都会被销毁

(二)简单描述每个周期具体适合哪些场景?

周期场景
beforeCreate可以在这加个loading事件,在加载实例时触发
created初始化完成时的事件写在这里,如在这结束loading事件异步请求(服务端渲染)也适宜在这里调用
mounted挂载元素,获取到DOM节点
updated如果对数据统一处理,在这里写上相应函数
beforeDestroy可以做一个确认停止事件的确认框
nextTick更新数据后立即操作dom;

(三)vue中父子组件的生命周期⭐⭐⭐⭐⭐

父子组件的生命周期是一个嵌套的过程
组件的调用顺序都是先父后子,渲染完成的顺序是先子后父。
组件的销毁操作是先父后子,销毁完成的顺序是先子后父。

  • 生命周期(父子组件):父组件更新前,子组件先销毁⭐
    • 父组件beforeCreate --> 父组件created --> 父组件beforeMount -->
    • 子组件beforeCreate --> 子组件created -->
    • 子组件beforeMount --> 子组件 mounted -->
    • 父组件mounted -->
    • 父组件beforeUpdate ⭐ -->
    • 子组件beforeDestroy--> 子组件destroyed ⭐ -->
    • 组件updated ⭐

  • 渲染的过程(子组件先mounted,父组件再mounted)
    • 父beforeCreate->父created->父beforeMount->
    • 子beforeCreate->子created->子beforeMount->子mounted->
    • 父mounted

  • 挂载阶段
    • 父created->子created->子mounted->父mounted

  • 子组件更新过程(子组件先 updated,父组件再 updated)
    • 父beforeUpdate->
    • 子beforeUpdate->子updated->
    • 父updated
  • 父组件更新过程
    父beforeUpdate->父updated

  • 销毁过程 (子组件先 destroyed,父组件再 destroyed)
    • 父beforeDestroy->
    • 子beforeDestroy->子destroyed->
    • 父destroyed