vue生命周期

68 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情juejin.cn/post/714765…

vue生命周期

image.png

  • beforeCreate(创建前):在实例化之后,数据的观测和事件的配置之前的时候调用,此时组建的选项对象还未创建,el和data并未初始化,因此无法访问methods,data,computed等上的方法和数据。(数据在它之后生成,一般不做任何操作,摆设而已,告诉你生命周期开始了。)
  • created(创建后):在创建之后使用,主要用于数据观测、属性和方法的运算,watch/event事件回调,完成了data数据的初始化,el没有。然后,挂载阶段还没有开始。(可以修改data,倒数第二次修改的机会,修改的话不会执行update,做初始数据的修改,可以在这里做ajax请求数据。)
  • beforeMount(挂载前):最后一次修改data不触发update的机会,虚拟dom生成了,但是真实dom还没生成,也可以进行ajax。用于在挂载之前使用,在这个阶段是获取不到dom操作的,把data里面的数据和模板生成html,完成了data等初始化,注意此时还没有挂载html到页面上。
  • mounted(挂载后):用于挂载之后使用,在这个时候可以获取到dom操作,比如可以获取到ref等操作的dom。这个时候只能调用一次ajax,在这个时候el和data都可以获取的到。mounted不会保证所有的子组件也都被挂载完成。如果你希望等到整个视图都渲染完毕在执行某些操作,可以在mounted内部使用vm.$nextTick。

image.png
this.$nextTick([callback])
参数:function [callback]
用法:
  将回调延迟到下次DOM更新循环之后执行。在修改数据之后立即使用它,然后等待DOM更新。它跟全局方法Vue.nextTick一样。不同的是回调的this自动绑定到调用它的实例上。

  • beforeUpdate(更新前):在数据更新之前被调用,发生在虚拟DOM重新渲染,可以在该钩子中进一步地更改状态,不会触发重新渲染过程。(不接受参数,更新前调用,一般不会做任何事情。)
  • updated(更新后):在由于数据更改导致虚拟DOM重新渲染和更新完毕后会调用,调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作,然后在大多数情况下,应该避免在此期间更改状态,因为这个可能会导致更新无限循环(如果要改的话最好使用计算属性或watch来代替)但是在服务器端渲染期间不被调用,可以用于监听某些数据的时候使用钩子。updated不会保证所有的子组件也都被重新渲染完毕,如果你希望等到整个视图都渲染完毕,可以再updated里面使用vm.$nextTick

image.png

  • beforeDestroy(销毁前):在这个时候还是可以用this来获取,可以用于销毁计时器时候使用,为了防止跳到其它页面该事件还在执行,还可以清除dom(清除计时器,清除非指令绑定的时间)事件等。
  • destroy(销毁后):在市里销毁之后调用,调用后,所有的时间监听器会被移出,所有的子实例也会被销毁。
    如果只是单纯的数据展示,在哪个生命周期请求最好?答案:created,能早当然早,不必非要等到mounted的时候在请求,什么情况下需要在mounted中请求呢?需要操作dom的时候。
  • activated:被Keep-alive缓存的组件激活时调用。(动态组件),该钩子在服务端渲染期间不被调用。
  • deactivated:被Keep-alive缓存的组件失活时调用。该钩子在服务端渲染期间不被调用。
  • errorCaptured:捕获一个来自后代组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的足见实力以及一个包含错误来源信息的字符串,此钩子可以返回false以阻止该错误继续向上传播。

image.png

image.png

image.png 注意 你可以在此钩子中修改组件的状态。因此在捕获错误时,在模板或渲染函数中有一个条件判断来绕过其它内容就能重要。不然组件可能会进入一个无限的渲染循环。