每一個vue實例在被建立以前都要通過一系列的初始化過程,這個過程就是vue的生命週期。詳細來講,就是Vue實例從開始建立,初始化數據,編譯模板,掛在dom->渲染,更新->渲染,卸載等一系列過程,咱們稱這是vue的生命週期,各個階段有相對應的事件鉤子。html
代碼:vue
let vm = new Vue({
// 當前這個實例他的父親是誰 兒子誰 有一套
beforeCreate(){
console.log(this);
console.log('---beforeCreate---');
},
data(){
return{
msg:'hello'
}
}
})
複製代碼
從打印出來的this,能夠看到此時發佈訂閱 emit等vue原生API已經初始化完成。可是不能訪問到data,computed,watch,methods上的方法和數據。這個鉤子函數不能作業務邏輯,通常狀況下這個鉤子函數能夠作的事情:在每一個組建中增長一些特定的屬性,例如混合。ios
這個實例已經實現了數據劫持,把方法、計算屬性 也都掛載到了實例,不能獲取到真實的dom元素。不能訪問到 ref屬性內容未空數組。 這個鉤子函數能夠發送axios請求把請求回來的數據保存到data中。axios
let vm = new Vue({
beforeCreate(){
console.log(this);
console.log('---beforeCreate---');
},
created(){
console.log(this);
console.log('---created---');
debugger;
},
data(){
return{
msg:'hello'
}
}
})
複製代碼
接下來就是渲染,可是在渲染以前會先判斷「是否有制定的el選項」,正常的寫法:el:'app',另外一種用:vm.$mount('app')數組
let vm = new Vue({
beforeCreate(){
console.log('---beforeCreate---')
},
created(){
console.log(this)
console.log('---created---')
},
beforeMount(){
console.log('---beforeMount---')
},
data(){
return{
msg:'hello'
}
}
})
vm.$mount()
複製代碼
雖然渲染失敗了,可是走到了beforeMount這個鉤子函數,它的要求是要麼有個template,或者有個render函數。 把二者中一個加上:
render(){
},
template:'<div>hello</div>',
複製代碼
驗證一下咱們以前沒有指定el,渲染在內存中,咱們把它掛載到頁面中去。app
vm.$mount()
console.log(vm.$el)
document.body.appendChild(vm.$el)
複製代碼
好處:能夠把渲染好的元素插入到本身想要的節點中。
在生命週期流程圖中,判讀完el選項後,就會再判讀是否有「指定的template選項」,是就將template編譯到render函數中,沒有則將el外部的HTML做爲template 編譯。 什麼叫作el外部的HTML?就是咱們經常使用:dom
<div id="app"></div>
vm.$mount('#app')
複製代碼
這個div就是el外部的HTML,再統一編譯到render函數中。異步
let vm = new Vue({
beforeCreate(){
console.log('---beforeCreate---')
},
created(){
console.log(this)
console.log('---created---')
},
render(){
console.log('---render---')
},
template:'<div>hello</div>',
beforeMount(){
console.log('---beforeMount---')
},
data(){
return{
msg:'hello'
}
}
})
vm.$mount('#app')
console.log(vm.$el)
document.body.appendChild(vm.$el)
複製代碼
優先級關係:render>template>out html函數
beforeMount 作的事情就是調用render方法,可是通常不會增長業務邏輯this
實例掛載到DOM上,此時能夠經過DOM API獲取到DOM節點,$ref屬性能夠訪問。
let vm = new Vue({
beforeCreate(){
console.log('---beforeCreate---')
},
created(){
console.log(this)
console.log('---created---')
},
template:'<div>hello</div>',
beforeMount(){
console.log('---beforeMount---')
},
mounted(){
console.log('---mounted---')
console.log(vm.$el)
},
data(){
return{
msg:'hello'
}
}
})
vm.$mount('#app')
複製代碼
能夠在這個鉤子函數中,增長一些數據更新,不會致使試圖屢次更新。 響應式數據更新時調用,發生在虛擬DOM打補丁以前。 組件更新以前執行的函數。 數據更新了,可是,vue(組件)對象對應的dom中的內部(innerHTML)沒有變,因此叫做組件更新前。
<div id="app">{{msg}}</div>
<script>
let vm = new Vue({
beforeCreate(){
console.log('---beforeCreate---')
},
created(){
console.log(this)
console.log('---created---')
},
beforeMount(){
console.log('---beforeMount---')
},
mounted(){
console.log('---mounted---')
console.log(vm.$el)
},
beforeupdate(){
console.log('---beforeupdate---')
},
data(){
return{
msg:'10'
}
}
})
vm.$mount('#app')
</script>
複製代碼
數據是應用到視圖上纔會變化。
虛擬 DOM 從新渲染和打補丁以後調用,組件DOM已經更新,可執行依賴於DOM的操做.
updated(){
this.msg= Math.random();
console.log('---updated---')
},
複製代碼
實例銷燬以前調用。這一步,實例仍然徹底可用,this仍能獲取到實例 這個鉤子函數通常作事件的移除、清空定時器
常見的銷燬方式:手動( vm.$destory()移除全部的觀察者 )、移除組件、路由切換 實例銷燬後調用,調用後,Vue 實例指示的全部東西都會解綁定,全部的事件監聽器會被移除,全部的子實例也會被銷燬。視圖並不會刷新,