正文:html
首先上初始化代碼(代碼不完整,完整代碼在下面的github裏),而後在控制檯打印並查看結果(console.group()表示該範圍內是一個組,方便查看一組)vue
View Codegit
結果顯示以下: github
ps:由於沒有更新數據和銷燬數據,因此beforeUpdate,updated,beforeDestroy和destroyed等鉤子函數沒有觸發,只打印出beforeCreate,created,beforeMount和mounted的鉤子函數狀況。app
在vue生命週期圖例中可知,能夠分爲如下幾個步驟:dom
一 beforeCreate—created間的生命週期 函數
這一步從圖中可知:是初始化data和事件,註冊和反映(這個翻譯感受不太對勁,說白了就是初始化)。this
打印結果以下:翻譯
經過代碼結果可知:$el,$data以及message都爲undefined,說明是處於初始化狀態。 3d
二 created—beforeMount間的生命週期
這一步,會進行兩次判斷:
* 判斷對象是否有el選項。
若是有的話就繼續向下編譯,
若是沒有el選項,則中止編譯。也就意味着中止了生命週期,直到在該vue實例上再次調用vm.$mount(el)纔會繼續往下編譯。
代碼結果演示以下:
1 當$el不掛載到vue時(註釋掉new Vue()裏的el)
結果以下:
經過如下代碼可知:當$el不掛載到vue時,只會進行beforeCreated和created這兩個鉤子函數,不會進行beforeMounted和mounted鉤子函數。
2 當從新調用時(輸入vm.$mount(el));
經過打印結果可知:在輸入vm.$mount('#app')時,發現這四個鉤子函數都實行了。能夠推斷,mount這一環節是保證$el已經掛載,且能夠進行任何數據操做。
** 判斷el是否有template模板:
若是有的話直接經過渲染函數渲染出來。
若是沒有的話,就直接調用$el的外部html進行渲染。
ps:所謂的template的就是vm對象裏的template屬性的值,若是template沒有值,則會調用外部的html。
如下demo實現,結論和打印結果:
1 當有template時:
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 二者不存在時,則不渲染也不報錯。
ps:另外,Vue對象中也有render函數,和template同樣,render能夠返回一個createElement參數,進行渲染。
<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>
經過演示可知:發現render比template優先級高一些。
因此三個渲染的優先級是:render函數選項 > template參數 > 外部HTML
三 beforeMount—mounted鉤子函數的生命週期
這一步的生命週期在於虛擬dom樹的渲染。
經過打印結果可知:
在beforeMounted鉤子函數中,掛載了$el,但只拿到{{message}},沒有完成渲染,
而mounted鉤子函數是已經完成了整個流程。
因此Vue生命週期圖例的意思應該是:給vue實例掛載$el,而且掛載到虛擬dom元素上。(一開始沒明白這一步,如今才恍然大悟)。
四 beforeUpdate—updated間的生命週期
這一步是當vue的data數據發生改變,就會觸發對應組件的從新渲染。而後依次觸發beforeUpdate和update鉤子函數。
ps:看到有位博主說到一個重點!這倆個鉤子函數只能在已渲染到模板裏的數據發生改變後才能觸發,不然不觸發。例子以下:
<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間的生命週期
beforeDestroy鉤子函數在實例銷燬以前調用。在這一步,實例仍然徹底可用。
destroyed鉤子函數在Vue 實例銷燬後調用。調用後,Vue 實例指示的全部東西都會解綁定,全部的事件監聽器會被移除,全部的子實例也會被銷燬。
實例以下:<script>
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()方法實行後會銷燬和當前實例有關的東西,不會再次對該實例進行操做。
結尾:
如下代碼與本文無關,請自行跳過 <P><A href="http://www.tongjink.com/"><FONT color=#ffffff>鄭州哪裏看婦科好</FONT> <P><A href="http://www.zzchanghong110.com/"><FONT color=#ffffff>鄭州檢查男科疾病去哪家醫院</FONT> <P><A href="http://www.zztj120.com/"><FONT color=#ffffff>鄭州婦科在線諮詢</FONT> <P><A href="http://www.ytsgnk.com/"><FONT color=#ffffff>鄭州看男科多少錢</FONT> <P><A href="http://www.zzfkyy120.com/"><FONT color=#ffffff>鄭州不孕不育正規醫院</FONT>
以上都是本身對vue的生命週期的理解,從一開始懵懂,到依次開發vue項目,回頭再看這生命週期,就有一種「原來如此」的感受,感到vue強大之處。
我是17號小白,我把完整代碼放到gitHub裏了,有須要實踐的請前往clone。地址:https://github.com/sqh17/notes/blob/master/ways/vueLifecycle.html。
以上如有不對的地方,請你們能及時私信我或者下方評論,咱們一塊兒加油進步。