一、Vue生命周期
Vue.js 的生命周期是指一个Vue实例从创建到销毁的整个过程,包括数据初始化、模板编译、挂载到DOM树、渲染、更新以及卸载等阶段。每个阶段都伴随着特定的钩子函数(生命周期钩子),允许开发者在组件的不同阶段执行自定义逻辑。
在Vue 2.x中,生命周期主要包含以下阶段:
-
初始化:
beforeCreate
:在创建Vue实例之前,可以执行这个方法,例如 加载动画操作created
:实例已经创建完成,属性已绑定,但DOM还未生成,$el属性还不存在。
-
模板编译及挂载前:
beforeMount
:模板已经在内存中编辑完成了,尚未被渲染到页面中mounted
:内存中的模板已经渲染到页面,用户已经可以看见内容
-
更新阶段:
beforeUpdate
:数据更新的前一刻,组件在发生更新之前,调用的函数updated
:updated执行时,内存中的数据已更新,并且页面已经被渲染
-
销毁阶段:
beforeDestroy
:钩子函数在实例销毁之前调用destroyed
:实例销毁后调用,所有指令解绑,所有数据观察器移除,所有子实例也已经被销毁。
二、代码演示
1、beforeCreate函数在组件实例化之前执行
-
代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <div id="app"> <button @click="test">测试按钮</button> <h1>数据:{{msg}}</h1> </div> </body> <script src="js/vue.min.js"></script> <script> var Vm = new Vue({ el: "#app", data: { msg: "测试数据", }, methods: { test: function () { alert("测试事件发生!"); }, }, beforeCreate() { alert("1.beforeCreate函数在组件实例化之前执行, msg: " + this.msg); }, }); </script> </html>
-
测试结果
注意,此时msg是未定义的,证明Vue实例尚未生成
2、created函数执行时,组件实例化完成,但是DOM(页面)还未生成
-
修改代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <div id="app"> <button @click="test">测试按钮</button> <h1>数据:{{msg}}</h1> </div> </body> <script src="js/vue.min.js"></script> <script> var Vm = new Vue({ el: "#app", data: { msg: "测试数据", }, methods: { test: function () { alert("测试事件发生!"); }, }, // beforeCreate() { // alert("1.beforeCreate函数在组件实例化之前执行, msg: " + this.msg); // }, created() { alert( "2.created函数执行时,组件实例化完成,但是DOM(页面)还未生成, msg:" + this.msg ); }, }); </script> </html>
-
测试结果
注意,此时msg是已经有值了,证明Vue实例已经生成,但界面上没有东西,证明dom未生成,页面未渲染
3、 beforeMount函数执行时,模板已经在内存中编辑完成了,尚未被渲染到页面中
-
修改代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <div id="app"> <button @click="test">测试按钮</button> <h1>数据:{{msg}}</h1> <h2 id="testBeforeMount">{{msg}}</h2> </div> </body> <script src="js/vue.min.js"></script> <script> var Vm = new Vue({ el: "#app", data: { msg: "测试数据", }, methods: { test: function () { alert("测试事件发生!"); }, }, // beforeCreate() { // alert("1.beforeCreate函数在组件实例化之前执行, msg: " + this.msg); // }, // created() { // alert( // "2.created函数执行时,组件实例化完成,但是DOM(页面)还未生成, msg:" + // this.msg // ); // }, beforeMount() { alert( "3.beforeMount函数执行时,模板已经在内存中编辑完成了,尚未被渲染到页面中" ); alert(document.getElementById("testBeforeMount").innerText); }, }); </script> </html>
-
测试结果
4、 mounted函数执行时,模板已经渲染到页面,执行完页面显示
-
修改代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <div id="app"> <button @click="test">测试按钮</button> <h1>数据:{{msg}}</h1> <h2 id="testBeforeMount">{{msg}}</h2> </div> </body> <script src="js/vue.min.js"></script> <script> var Vm = new Vue({ el: "#app", data: { msg: "测试数据", }, methods: { test: function () { alert("测试事件发生!"); }, }, // beforeCreate() { // alert("1.beforeCreate函数在组件实例化之前执行, msg: " + this.msg); // }, // created() { // alert( // "2.created函数执行时,组件实例化完成,但是DOM(页面)还未生成, msg:" + // this.msg // ); // }, // beforeMount() { // alert( // "3.beforeMount函数执行时,模板已经在内存中编辑完成了,尚未被渲染到页面中" // ); // alert(document.getElementById("testBeforeMount").innerText); // }, mounted() { alert("4.mounted函数执行时,模板已经渲染到页面,执行完页面显示"); alert(document.getElementById("testBeforeMount").innerText); }, }); </script> </html>
-
测试结果
5、 beforeUpdate执行时,内存中的数据已更新,但是页面尚未被渲染
-
修改代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <div id="app"> <button @click="test">测试按钮</button> <h1>数据:{{msg}}</h1> <!-- <h2 id="testBeforeMount">{{msg}}</h2> --> <button @click="change">更新数据</button> <h2 id="msgchange">{{msg}}</h2> </div> </body> <script src="js/vue.min.js"></script> <script> var Vm = new Vue({ el: "#app", data: { msg: "测试数据", }, methods: { test: function () { alert("测试事件发生!"); }, change: function () { this.msg = "新的数据"; }, }, // beforeCreate() { // alert("1.beforeCreate函数在组件实例化之前执行, msg: " + this.msg); // }, // created() { // alert( // "2.created函数执行时,组件实例化完成,但是DOM(页面)还未生成, msg:" + // this.msg // ); // }, // beforeMount() { // alert( // "3.beforeMount函数执行时,模板已经在内存中编辑完成了,尚未被渲染到页面中" // ); // alert(document.getElementById("testBeforeMount").innerText); // }, // mounted() { // alert("4.mounted函数执行时,模板已经渲染到页面,执行完页面显示"); // alert(document.getElementById("testBeforeMount").innerText); // }, beforeUpdate() { alert( "5.beforeUpdate执行时,内存中的数据已更新,但是页面尚未被渲染,内存数据msg:" + this.msg ); alert( "页面显示的内容:" + document.getElementById("msgchange").innerText ); alert("data中msg:" + this.msg); }, }); </script> </html>
-
测试结果
6、 updated执行时,内存中的数据已更新,此方法执行完显示页面!
-
修改代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <div id="app"> <button @click="test">测试按钮</button> <h1>数据:{{msg}}</h1> <!-- <h2 id="testBeforeMount">{{msg}}</h2> --> <button @click="change">更新数据</button> <h2 id="msgchange">{{msg}}</h2> </div> </body> <script src="js/vue.min.js"></script> <script> var Vm = new Vue({ el: "#app", data: { msg: "测试数据", }, methods: { test: function () { alert("测试事件发生!"); }, change: function () { this.msg = "新的数据"; }, }, // beforeCreate() { // alert("1.beforeCreate函数在组件实例化之前执行, msg: " + this.msg); // }, // created() { // alert( // "2.created函数执行时,组件实例化完成,但是DOM(页面)还未生成, msg:" + // this.msg // ); // }, // beforeMount() { // alert( // "3.beforeMount函数执行时,模板已经在内存中编辑完成了,尚未被渲染到页面中" // ); // alert(document.getElementById("testBeforeMount").innerText); // }, // mounted() { // alert("4.mounted函数执行时,模板已经渲染到页面,执行完页面显示"); // alert(document.getElementById("testBeforeMount").innerText); // }, // beforeUpdate() { // alert( // "5.beforeUpdate执行时,内存中的数据已更新,但是页面尚未被渲染,内存数据msg:" + // this.msg // ); // alert( // "页面显示的内容:" + document.getElementById("msgchange").innerText // ); // alert("data中msg:" + this.msg); // }, updated() { alert( "6.updated执行时,内存中的数据已更新,此方法执行完显示页面!msg:" + this.msg ); }, }); </script> </html>
-
测试结果