針對於Vue的生命周期進行詳細的說明,方面加深對各個方法的引用。
引言:
正文:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>vue生命周期</title> <script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script> </head> <body> <div id="app"> <h1>{{message}}</h1> </div> </body> <script> var vm = new Vue({ el: '#app', data: { message: 'Vue' }, beforeCreate: function() { console.group('------beforeCreate創建前狀態------'); console.log(this.$el); console.log(this.$data); console.log(this.message) }, created: function() { console.group('------created創建完畢狀態------'); console.log(this.$el); console.log(this.$data); console.log(this.message); }, beforeMount: function() { console.group('------beforeMount掛載前狀態------'); console.log(this.$el); console.log(this.$data); console.log(this.message); }, mounted: function() { console.group('------mounted 掛載結束狀態------'); console.log(this.$el); console.log(this.$data); console.log(this.message); }, beforeUpdate: function () { console.group('beforeUpdate 更新前狀態===============》'); console.log(this.$el); console.log(this.$data); console.log(this.message); }, updated: function () { console.group('updated 更新完成狀態===============》'); console.log(this.$el); console.log(this.$data); console.log(this.message); }, beforeDestroy: function () { console.group('beforeDestroy 銷毀前狀態===============》'); console.log(this.$el); console.log(this.$data); console.log(this.message); }, destroyed: function () { console.group('destroyed 銷毀完成狀態===============》'); console.log(this.$el); console.log(this.$data); console.log(this.message) } }) </script> </html>
結果顯示如下:
ps:因為沒有更新數據和銷毀數據,所以beforeUpdate,updated,beforeDestroy和destroyed等鈎子函數沒有觸發,只打印出beforeCreate,created,beforeMount和mounted的鈎子函數情況。
在vue生命周期圖例中可知,可以分為以下幾個步驟:
一 beforeCreate—created間的生命周期


二 created—beforeMount間的生命周期



var vm = new Vue({ el: '#app', template:'<h1 style="color:red">{{message}}</h1>', data: { message: 'Vue' } })
2 當無template時:
<body> <div id="app"> <h1>{{message}}</h1> </div> </body>
3 當兩者存在時,會優先選擇template渲染函數。
<body> <div id="app"> <h1>{{message}}</h1> </div> </body> <script> var vm = new Vue({ el: '#app', template:'<h1 style="color:red">{{message}}</h1>', data: { message: 'Vue' } }) </script>
4 兩者不存在時,則不渲染也不報錯。
<body> <div id="app"> <h1>{{message}}</h1> </div> </body> <script> var vm = new Vue({ el: '#app', template:'<h1 style="color:red">{{message}}</h1>', render: function (createElement, context) { return createElement('h1',`${this.message}1111`) }, data: { message: 'Vue' }, }) </script>
三 beforeMount—mounted鈎子函數的生命周期

通過打印結果可知:
四 beforeUpdate—updated間的生命周期
這一步是當vue的data數據發生改變,就會觸發對應組件的重新渲染。然后依次觸發beforeUpdate和update鈎子函數。
<body> <div id="app"> <!-- <h1>{{message}}</h1> --> </div> </body> <script> var vm = new Vue({ el: '#app', // template:'<h1 style="color:red">{{message}}</h1>', data: { message: 'Vue' }, beforeUpdate: function () { console.group('beforeUpdate 更新前狀態===============》'); console.log(this.$el); console.log(this.$data); console.log(this.message); }, updated: function () { console.group('updated 更新完成狀態===============》'); console.log(this.$el); console.log(this.$data); console.log(this.message); }, }) vm.message = 'aaaa'; </script>
結果可知:沒有觸發鈎子函數。
當把template的注釋去掉,結果如下:觸發了更新前后的鈎子函數。
五 beforeDestroy—destroyed間的生命周期
var vm = new Vue({ el: '#app', template:'<h1 style="color:red">{{message}}</h1>', data: { message: 'Vue' }, beforeDestroy: function () { console.group('beforeDestroy 銷毀前狀態===============》'); console.log(this.$el); console.log(this.$data); console.log(this.message); }, destroyed: function () { console.group('destroyed 銷毀完成狀態===============》'); console.log(this.$el); console.log(this.$data); console.log(this.message) } }) vm.$destroy(); vm.message='11111' </script>
ps:因為只有$destroy()方法,所以沒法判斷beforeDestroy和destroyed的區別
結果如下:發現銷毀之后,再重新給message賦值,沒效果。可見destroyed鈎子函數在$destroy()方法實行后會銷毀和當前實例有關的東西,不會再次對該實例進行操作。
結尾:
以上都是自己對vue的生命周期的理解,從一開始懵懂,到依次開發vue項目,回頭再看這生命周期,就有一種“原來如此”的感覺,感到vue強大之處。
我是17號小白,我把完整代碼放到gitHub里了,有需要實踐的請前往clone。地址:https://github.com/sqh17/notes/blob/master/ways/vueLifecycle.html。
以上若有不對的地方,請大家能及時私信我或者下方評論,我們一起加油進步。
參考文獻: