Vue - 01 生命周期
Vue有一套完整的生命周期,从开始创建、初始化数据、编译模板、挂在DOM、渲染、更新、渲染到销毁等一系列过程被称为Vue的生命周期。
总共分为三个阶段:初始化、运行中、销毁阶段。
生命周期过程具体说明:
- 实例通过new Vue()创建出来之后会初始化事件和生命周期,然后执行beforeCreate()函数,这个时候数据并没有挂载,只是一个空壳,无法访问到数据和真实DOM。
- 开始挂载数据、绑定事件等,然后执行created()函数,这个时候可以使用和更改数据,在这里更改数据,不会触发updated()函数,这是渲染前倒数第二次可以更改数据的机会,这样不会触发其他钩子函数,一般在这里做初始数据的获取。
- 开始寻找实例或组件对应的模板,将模板编译为虚拟DOM放入到render()函数中准备渲染,然后执行beforeMount()函数,在此函数中虚拟DOM已经创建完成,即将渲染,这是渲染前最后一次更改数据的机会,不会触发其他钩子函数,一般在这里做初始数据的获取。
- 开始渲染,渲染出真实DOM,然后执行mounted()函数,此时组件已经出现在页面中,数据和真实DOM都处理完毕,事件也挂载好了,在这里可以操作真实DOM等。
- 当组件或实例数据更改后,会执行beforeUpdate()函数,然后Vue的虚拟DOM机制会重新构建虚拟DOM并与上一次的虚拟DOM利用diff算法进行对比,之后重新渲染。
- 更新完成后,执行updated()函数,数据此时已经更改完成,DOM也重新渲染完毕,可以操作更新后的虚拟DOM。
- 当经过某种途径调用了$destroy()方法后,将立即执行beforeDestroy()函数,这里一般做一些善后工作,如清除定时器等。
- 最后将组件或实例的数据绑定、监听去掉后,只剩下DOM空壳,这时也可以执行destroyed()函数,这里主要也是做善后工作。
其中常用的函数:
- created():实例创建完成后使用。此阶段完成了数据的观测,但是未挂载,el此时还不可用,一般在这里初始化处理一些数据。
- mounted():el挂载到实例后调用。可在此使用ajax或axios获取服务端数据。
- beforeDestroy():实例被销毁前调用。主要用来清除定时器、解绑监听的事件等。
1 <!DOCTYPE html> 2 <html> 3 <head> 4 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width,initial-scale=1.0"> 7 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 8 <title> 9 定时更新的广告栏 10 </title> 11 <style> 12 </style> 13 </head> 14 15 <body> 16 <div id="Mbox" style="background-color: black;width: 500px;height: 100px;text-align: center;line-height: 100px;margin: auto;"> 17 <h3 style="color:white;"> 18 {{a}} 19 </h3> 20 </div> 21 </body> 22 </html> 23 24 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 25 <script> 26 var app=new Vue({ 27 el:"#Mbox", 28 data:{ 29 list:[], 30 index:0, 31 a:"" 32 }, 33 //实例创建后初始化数据 34 created:function(){ 35 this.list=["地球交通委提醒您:", 36 "道路千万条", 37 "安全第一条", 38 "行车不规范", 39 "亲人两行泪"]; 40 this.a=this.list[0]; 41 }, 42 //el挂载到实例后,创建定时器 43 mounted:function(){ 44 var t=this; 45 this.time=setInterval(function(){ 46 if(t.index<t.list.length-1){ 47 t.index++; 48 } 49 else { 50 t.index=0; 51 }; 52 t.a=t.list[t.index]; 53 },3000) 54 }, 55 //销毁前清除定时器 56 beforeDestroy:function(){ 57 if (this.time) { 58 clearInterval(this.time); 59 console.log(this.a); 60 } 61 } 62 63 }) 64 </script>

浙公网安备 33010602011771号