vue生命周期钩子函数

生命周期

在vue生命周期中会进行以下四个阶段:实例化、创建dom、更新dom、销毁dom,具体流程如下图

钩子函数

当明白这个流程后可以在每个阶段添加上对应的钩子函数

如上图其实整个vue生命周期包含的构造函数如下:

sql 复制代码
before create
created
before mount
mounted
before update
updated
before destroy
destroyed

组件创建

整个生命周期的运行流程又是如何运行的呢?接下来将举例说明,如下图一个页面有三个组件,组件A为根组件其中引用组件B,组件B作为组件A的子组件,也引用一个组件C。

当创建这个界面生命周期将会先执行组件A的的钩子函数beforecreatecreatedbeforemount, 在创建render之后运行beforemount 生成虚拟dom,发现组件B等待,先去创建组件B 执行组件B的钩子函数beforecreatecreatedbeforemount, 同理在创建render之后运行beforemount 生成虚拟dom暂停,发现组件C, 执行组件B的钩子函数beforecreatecreatedbeforemount,这是由于C没有子组件所以执行mounted创建真实dom,C组件创建完成,对应B组件也执行mounted创建真实dom,B组件完成,对应A组件也执行mounted创建真实dom。

从上图,可以看出整个页面渲染会根据组件进行重复递归循环的创建dom元素。所以整个页面创建流程执行结果应该如下:

js 复制代码
组件   钩子函数
A    beforecreate   //这个阶段,没有实例化完成,无法做事
A    created        //这个阶段,可以获取data数据
A    beforemount    //页面还在创建,无法拿去页面元素
·································································
B    beforecreate   //有子组件递归循环
B    created
B    beforemount
·································································
C    beforecreate   
C    created
C    beforemount     //没有子组件,完成C组件渲染
C    mounted         //返回C组件渲染结果
·································································
B    mounted
·································································
A    mounted

组件更新

假设点击A组件按钮,更新子组件C的数据0变成1,如下图: 执行更新流程,先执行A组件函数beforeupdate,然后发现B组件也需要更新,A组件更新暂停,先执行B组件的beforeupdate,发现C组件也需要更新,B组件更新暂停,执行C组件的beforeupdateupdated,C组件更新完成后,完成B组件、A组件的updated

从上图,可以看出整个页面渲染会根据组件进行重复递归循环的更新dom元素。所以整个页面更新流程执行结果应该如下:

js 复制代码
组件   钩子函数
A    beforeupdate
B    beforeupdate
C    beforeupdate
C    updated
B    updated
A    updated

组件销毁/更新

假设现在A页面存在一个temp变量,点击"按钮1" temp变量变成1,对应的B组件'v-if'将会执行,如下图: 首先要明确A组件是更新,B、C是销毁,对应的生命周期执行,点击a组件的"按钮",首先会触发A组件的beforeupdate更新函数,执行B函数,因为v-if为false则销毁B组件,由于B组件引用C组件,所以对应的C组件也需要销毁,所以整个流程会调用的钩子函数如下图:

整个页面更新流程执行结果应该如下:

js 复制代码
组件   钩子函数
A    beforeupdate
B    beforedestroy
C    beforedestroy
C    destroyed
B    destroyed
A    updated

如果再次点击将temp的1改成0 页面更新流程执行结果应该如下:

js 复制代码
组件   钩子函数
A    beforeupdate
B    beforecreate
B    created
B    beforemount
C    beforecreate
C    created
C    beforemount
C    mounted
B    mounted
A    updated

组件更新的原理,其实是通过对应虚拟dom树,虚拟dom树是json字符串,当用户改变后,则通过对比新旧虚拟dom是否发生变化,如果变化,则指向新的虚拟dom,触发对应的组件的钩子函数,同时页面真实dom发生变化,如果页面没(组件)没有变化,不会执行对应钩子函数。

相关推荐
寻找09之夏1 小时前
【Vue3实战】:用导航守卫拦截未保存的编辑,提升用户体验
前端·vue.js
多多米10052 小时前
初学Vue(2)
前端·javascript·vue.js
看到请催我学习2 小时前
内存缓存和硬盘缓存
开发语言·前端·javascript·vue.js·缓存·ecmascript
golitter.4 小时前
Vue组件库Element-ui
前端·vue.js·ui
道爷我悟了4 小时前
Vue入门-指令学习-v-on
javascript·vue.js·学习
.生产的驴5 小时前
Electron Vue框架环境搭建 Vue3环境搭建
java·前端·vue.js·spring boot·后端·electron·ecmascript
老齐谈电商5 小时前
Electron桌面应用打包现有的vue项目
javascript·vue.js·electron
LIURUOYU4213085 小时前
vue.js组建开发
vue.js
九圣残炎6 小时前
【Vue】vue-admin-template项目搭建
前端·vue.js·arcgis
《源码好优多》6 小时前
基于SpringBoot+Vue+Uniapp的植物园管理小程序系统(2024最新,源码+文档+远程部署+讲解视频等)
vue.js·spring boot·uni-app