淺談一下Vue技術(shù)棧之生命周期
1、什么是生命周期
- 又名:
生命周期回調(diào)函數(shù)、生命周期函數(shù)、生命周期鉤子。 - 是什么:Vue在關(guān)鍵時刻幫我們調(diào)用的一些
特殊名稱的函數(shù)。 - 生命周期函數(shù)的名字
不可更改,但函數(shù)的具體內(nèi)容是程序員根據(jù)需求編寫的。 - 生命周期函數(shù)中的
this指向是vm或組件實例對象。
2、分析生命周期
2.1 生命周期鉤子函數(shù)
每個Vue實例在創(chuàng)建時都要經(jīng)過一系列的初始化過程。例如,需要設(shè)置數(shù)據(jù)偵聽、編譯些生命周期鉤子函數(shù),給用戶在不同階段添加代碼的機會。
2.2 生命周期鉤子函數(shù)的作用
- 有一些其他鉤子,在實例生命周期的不同階段被調(diào)用,如
mounted,updated和destroyed。 - 生命周期鉤子的
this關(guān)鍵字上下文指向調(diào)用它的Vue 實例,調(diào)用方法如this.$el。
注:不能使用
箭頭函數(shù)(()=>)定義一個生命周期方法,如created:()=> this.fetchTodos()。 這是因為箭頭函數(shù)綁定了父上下文,因此 this與期待的Vue實例不同,this.fechTodos()的行為未定義。
2.3 生命周期鉤子函數(shù)圖例

基本語法:
beforeCreate() {
console.log('beforeCreate')
},
created() {
console.log('created')
},
beforeMount() {
console.log('beforeMount')
},
mounted() {
console.log('mounted')
},
beforeUpdate() {
console.log('beforeUpdate')
},
updated() {
console.log('updated')
},
beforeDestroy() {
console.log('beforeDestroy')
},
destroyed() {
console.log('destroyed')
}語法說明:
Vue 實例有一個完整的生命周期,即 Vue 實例從創(chuàng)建到銷毀的過程。具體可細分為開始 創(chuàng)建、初始化數(shù)據(jù)、編譯模板、掛載 DOM 渲染、更新渲染、卸載等一系列過程,稱為 Vue 的生命周期。在 Vue 的整個生命周期中,提供了一些生命周期鉤子函數(shù),為執(zhí)行自定義邏輯 提供了機會。
beforeCreate:在實例初始化之后,數(shù)據(jù)觀測和 event/watch 事件配置之前被調(diào)用。created:實例已經(jīng)創(chuàng)建完成之后被調(diào)用。在這一步,實例已完成以下的配置:數(shù)據(jù)觀測、屬性和方法的運算、event/watch 事件回調(diào)。然而,掛載階段還沒有開始,$el 屬性目前不可見。beforeMount:在掛載開始之前被調(diào)用,相關(guān)的渲染函數(shù)首次被調(diào)用。在此階段,它檢查是否有任何模板可用于要在 DOM 中呈現(xiàn)的對象:如果沒有找到模板,那么將所定義元素的外部 HTML 視為模板。mounted:el 被新創(chuàng)建的vm. $el替換,并掛載到實例上,之后調(diào)用該鉤子。一旦模板準備就緒,它將數(shù)據(jù)放入模板并創(chuàng)建可呈現(xiàn)元素。beforeUpdate:數(shù)據(jù)更新時調(diào)用,發(fā)生在虛擬 DOM 重新渲染和打補丁之前??梢栽诖算^子中進一步更改狀態(tài),不會觸發(fā)附加的重渲染過程。updated:由于數(shù)據(jù)更改導致的虛擬 DOM 重新渲染和打補丁,在此之后調(diào)用該鉤子。通過實際更新 DOM 對象并觸發(fā)updated 鉤子,屏幕上的變化得到呈現(xiàn)。beforeDestroy:實例銷毀之前調(diào)用。在這一步,實例仍然完全可用。在 Vue 對象被破壞并從內(nèi)存中釋放之前,beforeDestroy 鉤子被觸發(fā),并允許在其中處理自定義代碼。destroyed:Vue 實例銷毀后調(diào)用。調(diào)用后,Vue 實例指示的所有東西都會解綁,所有事件偵聽器會被移除,所有子實例也會被銷毀。該鉤子在服務器端渲染期間不被調(diào)用。 可以使用生命周期鉤子函數(shù)在 Vue對象生命周期的不同階段添加自定義代碼。它將幫助 設(shè)計人員控制在 DOM 中創(chuàng)建對象的流程,以及更新和刪除對象。
完整生命周期鉤子函數(shù)調(diào)用關(guān)系如下圖所示:

2.4 生命周期鉤子函數(shù)的應用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
</head>
<body>
<div id="root">
<h3>{{information}}</h3>
<button @click="changeInformation">改變信息</button>
<button @click="destroyVM">銷毀Vue實例</button>
</div>
<script>
new Vue({
el: '#root',
data() {
return {
information: '東方青云歡迎您'
}
},
methods: {
changeInformation() {
this.information = '我來了,您在哪里?'
},
destroyVM() {
this.$destroy()//銷毀Vue實例
}
},
beforeCreate() {
console.log('=====beforeCreate=====')
console.log('el:' + this.$el)//未定義
console.log("data:" + this.$data)//未定義
console.log('=====beforeCreate=====')
},
created() {
console.log('====created=====');
console.log('el:' + this.$el)//未定義
console.log("data:" + this.$data)//已被初始化為[object Object]
console.log("information:" + this.information);//information:東方青云歡迎您
console.log('====created=====');
},
beforeMount() {
console.log('====beforeMount====');
console.log('el:' + this.$el);//el:[object HTMLDivElement]
console.log(this.$el);//當前掛載元素
document.querySelector('h3').innerText = '1'//無效,虛擬dom
},
mounted() {
// document.querySelector('h3').innerText = '1'//有效,已轉(zhuǎn)化為真實dom
},
beforeUpdate() {
console.log('====beforeUpdate====');
console.log(this.information);
// debugger;//斷點調(diào)試
},
updated() {
console.log(this.information);
},
beforeDestroy() {
console.log('我要被銷毀了');
},
destroyed() {
console.log('銷毀完畢');
},
})
</script>
</body>
</html>3、生命周期總結(jié)
常用的生命周期鉤子:
mounted: 發(fā)送ajax請求、啟動定時器、綁定自定義事件、訂閱消息等【初始化操作】。beforeDestroy: 清除定時器、解綁自定義事件、取消訂閱消息等【收尾工作】。
關(guān)于銷毀Vue實例:
- 銷毀后借助Vue開發(fā)者工具看不到任何信息。
- 銷毀后
自定義事件會失效,但原生DOM事件依然有效。 - 一般不會在beforeDestroy操作數(shù)據(jù),因為即便操作數(shù)據(jù),也
不會再觸發(fā)更新流程了。
到此這篇關(guān)于淺談一下Vue技術(shù)棧之生命周期的文章就介紹到這了,更多相關(guān)Vue技術(shù)棧的生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue打印插件vue-print-nb的實現(xiàn)代碼
這篇文章主要介紹了vue打印插件vue-print-nb的實現(xiàn),需要引入插件npm install vue-print-nb --save,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03

