从0开始学Vue系列13--生命周期的更新&销毁流程

302 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情

我要一步一步往上爬~大家好,我是努力不浪费每分每秒热爱生活的小朋友,今天我们来一起学习一下Vue的更新和销毁流程,并对生命周期做个小总结。

1. 当data改变时

-->钩子函数beforeUpdate

新数据渲染之前,此时,数据已经更新了,但是页面是旧的,还没来得及更新,此生命周期钩子中,页面和数据尚未保持同步。

-->重新生成虚拟DOM:本次的虚拟DOM和上次已经渲染完成的DOM比较,找出区别(深度优先原则)生成补丁包(dom diff),补丁包生成真实DOM,重新渲染页面,完成页面的更新,实现了模型Model到视图View的更新。

挂载时是Model到View的初次渲染,现在是更新.

-->钩子函数updated

新数据渲染之后,此时数据和页面都是最新的,数据和页面保持一致了。注意此时修改响应数据会导致死循环!

2. 销毁流程

--> vm.destroy()被调用,vm.destroy() 被调用,`vm.destroy()`可以完全销毁一个vm实例,清理它和其他实例之间的连接,解绑vm的全部指令以及事件(自定义事件)监听器。

-->钩子函数beforeDestroy

此时,vm中所有的data和methods都处于可用的状态,马上要执行销毁过程了,此时一般会执行关闭定时器、取消订阅、解除绑定等收尾操作。

--> Teardown watchers,child components and event listeners。销毁监视、子组件、自定义事件监听器

-->钩子函数destroyed:销毁之后

3. 声明周期总结

  • 一共有四对生命周期函数
  • vm的一生:
    • 将要创建==>调用beforeCreate函数
    • 创建完毕==>调用created函数
    • 将要挂载==>调用beforeMount函数
    • 挂载完毕==>调用mounted函数(初始化工作:开启定时器、发送网络请求、绑定自定义事件、订阅消息...)
    • 将要更新==>调用beforeUpdate函数
    • 更新完毕==>调用updated函数
    • 将要销毁==>调用beforeDestroy函数(收尾工作:关闭定时器、取消订阅...)
    • 销毁完毕==>调用destroyed函数 所以常用的生命周期钩子有mountedbeforeDestroy两个
  • 销毁vue实例
    • 销毁后,借助浏览器的vue开发者工具看不到任何信息
    • 销毁后自定义事件会消失,但是原生DOM事件依然有效
    • 在beforeDestroy函数中,一般不会操作数据,因为即使操作了数据,也不会触发在它之前的Update流程.