vue生命周期四個(gè)階段created和mount詳解
1.四個(gè)階段
1)必經(jīng)階段

2)非必經(jīng)階段

提示:主動(dòng)調(diào)用 vm.$destroy() 函數(shù)銷(xiāo)毀后,可用 vm.$mount("#app") 將斷開(kāi)的 new Vue() 和頁(yè)面重新建立虛擬 DOM 樹(shù),重新綁定起來(lái)掛載界面。
2. 生命周期鉤子函數(shù)(回調(diào)函數(shù))
每個(gè)階段前后,各有一對(duì)生命周期鉤子函數(shù),也就是回調(diào)函數(shù)。

3.在Vue中,created和mount分別應(yīng)該在什么場(chǎng)景情況使用?有什么區(qū)別
1)created是組件實(shí)例被創(chuàng)建后立即調(diào)用的鉤子函數(shù)。
它適用于需要在組件實(shí)例被創(chuàng)建后進(jìn)行一些始化初工作的場(chǎng)景。在created鉤子函數(shù)中,可以訪問(wèn)組件的數(shù)據(jù)和方法,但是此時(shí)組件的DOM元素尚未生成,所以無(wú)法直接操作DOM。通常在created鉤子函數(shù)中進(jìn)行一些異步操作、初始化數(shù)據(jù)、訂閱事件等。
export default {
created() {
// 異步操作
this.fetchData()
// 初始化數(shù)據(jù)
this.message = 'Hello, Vue!'
// 訂閱事件
this.$bus.$on('event', this.handleEvent)
},
methods: {
fetchData() {
// 異步請(qǐng)求數(shù)據(jù)
},
handleEvent() {
// 處理事件
}
}
}2)mounted是組件實(shí)例被掛載到DOM后調(diào)用的鉤子函數(shù)。
它適用于需要在組件掛載到DOM后進(jìn)行一些DOM相關(guān)的操作的場(chǎng)景。在mounted鉤子函數(shù)中,可以訪問(wèn)組件的數(shù)據(jù)、方法和DOM元素。可以進(jìn)行DOM操作、調(diào)用第三方庫(kù)、發(fā)送請(qǐng)求等。
export default {
mounted() {
// 獲取DOM元素
const el = document.getElementById('my-element')
// 使用第三方庫(kù)
this.$refs.myLibrary.doSomething()
// 發(fā)送請(qǐng)求
this.$http.get('/data').then(response => {
// 處理響應(yīng)
})
}
}總結(jié):
- created適用于組件實(shí)例被創(chuàng)建后進(jìn)行初始化工作的場(chǎng)景,可以訪問(wèn)組件的數(shù)據(jù)和方法,但無(wú)法直接操作DOM。
- mounted適用于組件掛載到DOM后進(jìn)行DOM相關(guān)的操作的場(chǎng)景,可以訪問(wèn)組件的數(shù)據(jù)、方法和DOM元素。
- created和mount分別的應(yīng)用場(chǎng)景,在created鉤子函數(shù)中進(jìn)行數(shù)據(jù)初始化,mounted鉤子函數(shù)中進(jìn)行DOM操作,也就是說(shuō)在created鉤子函數(shù)調(diào)用時(shí),還沒(méi)有接口調(diào)用產(chǎn)生數(shù)據(jù),也沒(méi)有html的分解dom樹(shù),即頁(yè)面還沒(méi)有渲染。所以created鉤子函數(shù)在mounted之前使用的話(huà),可以用于一些需要準(zhǔn)備好數(shù)據(jù)再搭建頁(yè)面渲染的情況,比如一些圖表之類(lèi)。
- 對(duì)于需要準(zhǔn)備好數(shù)據(jù)后再進(jìn)行頁(yè)面渲染的情況,可以在created鉤子函數(shù)中進(jìn)行數(shù)據(jù)的初始化和異步請(qǐng)求,然后將數(shù)據(jù)保存到組件的響應(yīng)式數(shù)據(jù)中。一旦數(shù)據(jù)準(zhǔn)備好,當(dāng)組件被掛載到DOM時(shí),mounted鉤子函數(shù)會(huì)被調(diào)用,你可以在這個(gè)階段執(zhí)行圖表的渲染、計(jì)算布局等與DOM相關(guān)的操作。
4.一些舉例:關(guān)于開(kāi)發(fā)需求中需要進(jìn)行數(shù)據(jù)初始化和非DOM相關(guān)的準(zhǔn)備工作情況,以及有哪些需要進(jìn)行DOM操作和與DOM相關(guān)的操作。
1)數(shù)據(jù)初始化和異步請(qǐng)求:
- 在
created鉤子函數(shù)中,可以初始化組件的數(shù)據(jù),例如從后端獲取初始數(shù)據(jù)。 - 發(fā)起異步請(qǐng)求,獲取數(shù)據(jù)并更新組件的數(shù)據(jù)。
export default {
data() {
return {
users: []
};
},
created() {
// 初始化數(shù)據(jù)
this.fetchUsers();
},
methods: {
fetchUsers() {
// 異步請(qǐng)求數(shù)據(jù)
axios.get('/api/users').then(response => {
this.users = response.data;
});
}
}
};2)訂閱事件:
在created鉤子函數(shù)中,可以訂閱全局或本地事件,以便在接收到事件時(shí)執(zhí)行相應(yīng)的操作。
export default {
created() {
// 訂閱全局事件
this.$bus.$on('event', this.handleEvent);
},
destroyed() {
// 取消訂閱全局事件
this.$bus.$off('event', this.handleEvent);
},
methods: {
handleEvent() {
// 處理事件
}
}
};3)當(dāng)需要進(jìn)行DOM操作和與DOM相關(guān)的操作時(shí),以下是一些示例:
操作DOM元素:
在mounted鉤子函數(shù)中,可以通過(guò)this.$refs訪問(wèn)到組件中的DOM元素,并進(jìn)行操作,如添加、刪除、修改元素的樣式、屬性等。
<template>
<div ref="myElement">Hello, Vue!</div>
</template>
<script>
export default {
mounted() {
// 獲取DOM元素
const el = this.$refs.myElement;
// 操作DOM元素
el.style.color = 'red';
el.textContent = 'Updated content';
}
};
</script>使用第三方庫(kù):
在mounted鉤子函數(shù)中,可以初始化和使用第三方庫(kù),如圖表庫(kù)、地圖庫(kù)等。通過(guò)操作DOM元素,將第三方庫(kù)的功能集成到組件中。
export default {
mounted() {
// 使用第三方庫(kù)
const chart = new Chart(this.$refs.chartCanvas, {
type: 'bar',
data: {
labels: ['A', 'B', 'C'],
datasets: [{
label: 'Data',
data: [10, 20, 30]
}]
}
});
// 其他DOM操作
this.$refs.chartCanvas.style.width = '100%';
}
};5.補(bǔ)充
1)什么是實(shí)例,什么是實(shí)例被掛載到DOM,什么是dom,dao操作又是什么
在Vue中,"實(shí)例"是指通過(guò)Vue構(gòu)造函數(shù)創(chuàng)建的一個(gè)Vue組件對(duì)象。每個(gè)Vue組件都是一個(gè)獨(dú)立的實(shí)例,具有自己的數(shù)據(jù)、方法和生命周期??梢酝ㄟ^(guò)實(shí)例來(lái)訪問(wèn)和操作組件的屬性和方法。
"實(shí)例被掛載到DOM"指的是將Vue組件實(shí)例與實(shí)際的DOM元素建立關(guān)聯(lián),使組件能夠在頁(yè)面上顯示和交互。當(dāng)Vue組件實(shí)例經(jīng)過(guò)創(chuàng)建、編譯和渲染過(guò)程后,最終會(huì)被掛載到HTML中的某個(gè)DOM元素上,從而成為該DOM元素的子節(jié)點(diǎn)。
"DOM"是指文檔對(duì)象模型(Document Object Model),它是瀏覽器將HTML文檔解析成樹(shù)狀結(jié)構(gòu)的方式。DOM提供了訪問(wèn)和操作HTML元素的接口,使得可以通過(guò)JavaScript來(lái)操作和修改網(wǎng)頁(yè)的內(nèi)容、結(jié)構(gòu)和樣式。
DOM操作(也稱(chēng)為DOM操作)是指使用JavaScript來(lái)操縱DOM元素,改變其屬性、樣式和內(nèi)容,以實(shí)現(xiàn)動(dòng)態(tài)更新和交互效果。DOM操作可以通過(guò)原生的JavaScript方法和屬性進(jìn)行,也可以使用第三方庫(kù)(如jQuery)提供的封裝方法進(jìn)行。
在Vue中,通常會(huì)使用Vue的數(shù)據(jù)綁定和指令系統(tǒng)來(lái)操作DOM,而不直接使用傳統(tǒng)的DOM操作。Vue通過(guò)響應(yīng)式數(shù)據(jù)和虛擬DOM的機(jī)制,實(shí)現(xiàn)了高效的數(shù)據(jù)更新和DOM渲染,簡(jiǎn)化了DOM操作的復(fù)雜性。
也就是說(shuō)在Vue的應(yīng)用程序中,有多個(gè)組件,每個(gè)組件都有自己獨(dú)立的實(shí)例。這樣可以使組件之間的數(shù)據(jù)和邏輯相互隔離,實(shí)現(xiàn)組件的復(fù)用和擴(kuò)展。而組件可以是頁(yè)面也可以是工具組件,用來(lái)實(shí)現(xiàn)復(fù)用。
即:
組件可以是頁(yè)面級(jí)別的組件,例如一個(gè)用戶(hù)登錄頁(yè)、一個(gè)商品列表頁(yè)或者一個(gè)博客文章詳情頁(yè)。這些頁(yè)面級(jí)別的組件通常由更小的工具組件組成,用于展示特定的功能、處理特定的邏輯等。工具組件可以是按鈕、表單輸入框、彈出框、加載動(dòng)畫(huà)等等。
通過(guò)將應(yīng)用程序劃分為多個(gè)組件,每個(gè)組件都有自己的責(zé)任和功能,可以更好地組織和管理代碼。組件之間通過(guò)props和事件進(jìn)行通信,父組件可以向子組件傳遞數(shù)據(jù)和方法,子組件可以通過(guò)事件向父組件發(fā)送消息。
這種組件化的開(kāi)發(fā)方式使得組件可以被復(fù)用,可以在不同的上下文中使用相同的組件。例如,一個(gè)商品列表組件可以在不同的頁(yè)面中使用,一個(gè)按鈕組件可以在多個(gè)地方進(jìn)行重復(fù)使用。這樣可以大大提高開(kāi)發(fā)效率,減少代碼冗余。
另外,組件化還提供了更好的可擴(kuò)展性。通過(guò)維護(hù)和擴(kuò)展現(xiàn)有的組件庫(kù),可以快速開(kāi)發(fā)出新的功能,而不需要從頭開(kāi)始編寫(xiě)大量的代碼。
2)每個(gè)組件在Vue中都有自己獨(dú)立的實(shí)例,且每個(gè)組件只有唯一一個(gè)實(shí)例。
當(dāng)我們?cè)赩ue中使用組件時(shí),每個(gè)組件會(huì)被實(shí)例化為一個(gè)Vue組件實(shí)例。這意味著無(wú)論有多少個(gè)相同的組件在應(yīng)用程序中使用,每個(gè)組件都會(huì)有自己的獨(dú)立實(shí)例。
例如,如果我們?cè)谝粋€(gè)頁(yè)面中使用了兩個(gè)相同的自定義組件,那么每個(gè)組件實(shí)例都是獨(dú)立的,它們具有自己的數(shù)據(jù)、方法和生命周期鉤子函數(shù)。它們之間的數(shù)據(jù)和狀態(tài)是相互隔離的,互不影響。
這種獨(dú)立實(shí)例的特性使得組件能夠?qū)崿F(xiàn)高度的復(fù)用性和可組合性。每個(gè)組件實(shí)例都可以根據(jù)自己的需求進(jìn)行數(shù)據(jù)的初始化、事件的監(jiān)聽(tīng)、方法的調(diào)用等操作,而不會(huì)與其他組件實(shí)例發(fā)生沖突。
總結(jié)起來(lái),每個(gè)組件在Vue中都有自己獨(dú)立的實(shí)例,且每個(gè)組件只有唯一一個(gè)實(shí)例。這種設(shè)計(jì)使得組件能夠在應(yīng)用程序中獨(dú)立運(yùn)作,相互之間不會(huì)產(chǎn)生副作用。
3)實(shí)例是起到什么作用呢?或者說(shuō)實(shí)例用來(lái)實(shí)現(xiàn)什么功能呢?
實(shí)例在Vue中起到了以下幾個(gè)重要的作用和功能:
- 數(shù)據(jù)驅(qū)動(dòng):實(shí)例通過(guò)數(shù)據(jù)綁定的機(jī)制,將數(shù)據(jù)與視圖進(jìn)行關(guān)聯(lián),實(shí)現(xiàn)了數(shù)據(jù)驅(qū)動(dòng)的UI更新。通過(guò)實(shí)例的數(shù)據(jù)屬性,我們可以在模板中使用插值語(yǔ)法或指令來(lái)動(dòng)態(tài)展示數(shù)據(jù),實(shí)現(xiàn)頁(yè)面內(nèi)容的自動(dòng)更新。
- 方法和計(jì)算屬性:實(shí)例中的方法和計(jì)算屬性提供了對(duì)數(shù)據(jù)的處理和計(jì)算的功能。通過(guò)實(shí)例的方法,我們可以定義各種操作、事件處理、異步請(qǐng)求等邏輯。而計(jì)算屬性則可以根據(jù)數(shù)據(jù)的變化實(shí)時(shí)計(jì)算出新的值,供模板使用。
- 生命周期鉤子:實(shí)例提供了一系列的生命周期鉤子函數(shù),用于在組件的不同階段執(zhí)行特定的操作。例如,可以在
created鉤子函數(shù)中進(jìn)行數(shù)據(jù)初始化,mounted鉤子函數(shù)中進(jìn)行DOM操作,destroyed鉤子函數(shù)中清理資源等。 - 組件通信:實(shí)例可以通過(guò)props和事件進(jìn)行組件間的通信。通過(guò)props,父組件可以向子組件傳遞數(shù)據(jù)和參數(shù)。而子組件可以通過(guò)觸發(fā)事件并傳遞數(shù)據(jù),將消息傳遞給父組件或其他組件。
- 組件復(fù)用和組合:實(shí)例的獨(dú)立性使得組件可以被復(fù)用和組合。我們可以創(chuàng)建多個(gè)相同的組件實(shí)例,每個(gè)實(shí)例都有自己的狀態(tài)和行為。這樣可以實(shí)現(xiàn)組件的復(fù)用,減少代碼冗余。同時(shí),組件可以作為其他組件的子組件,通過(guò)組合不同的組件實(shí)現(xiàn)更復(fù)雜的功能。
總之,實(shí)例在Vue中扮演了數(shù)據(jù)驅(qū)動(dòng)、方法和計(jì)算屬性、生命周期管理、組件通信以及組件復(fù)用和組合等重要角色。通過(guò)實(shí)例,我們可以構(gòu)建出具有豐富交互和可組合性的Vue應(yīng)用程序。
6.總結(jié)
1)在需要調(diào)用一個(gè)已經(jīng)封裝的接口函數(shù)時(shí),也就是異步獲取數(shù)據(jù),如果只是單純的需要拿到數(shù)據(jù),那么可以使用created也可以使用mounted,但是這種情況一般使用created。而如果我并不是需要單純的拿到數(shù)據(jù),我需要對(duì)數(shù)據(jù)進(jìn)行處理,或者將數(shù)據(jù)賦值,或者將數(shù)據(jù)展示在表格、表單上,這種情況我應(yīng)該用mounted比較好,而不是用created。
當(dāng)只需要獲取數(shù)據(jù)而不需要對(duì)其進(jìn)行處理或應(yīng)用到DOM上時(shí),可以選擇在created鉤子函數(shù)中進(jìn)行異步請(qǐng)求。因?yàn)?code>created鉤子函數(shù)在組件實(shí)例創(chuàng)建后立即調(diào)用,適合于數(shù)據(jù)初始化和非DOM相關(guān)的操作。
然而,如果需要對(duì)數(shù)據(jù)進(jìn)行處理、賦值給組件的屬性、展示在表格、表單等組件上,或者進(jìn)行與DOM相關(guān)的操作,那么在mounted鉤子函數(shù)中執(zhí)行異步請(qǐng)求更為合適。因?yàn)樵?code>mounted鉤子函數(shù)中,組件已經(jīng)被掛載到DOM上,可以直接訪問(wèn)和操作DOM元素,以及應(yīng)用數(shù)據(jù)到組件的視圖上。
2)關(guān)于:(這種異步請(qǐng)求數(shù)據(jù)的方式,通常在mounted鉤子函數(shù)中調(diào)用,以確保在組件掛載到DOM之后再發(fā)起請(qǐng)求。這樣可以避免在組件渲染之前就獲取到數(shù)據(jù),保證數(shù)據(jù)的正確性和一致性。)如果在created調(diào)用,為什么會(huì)產(chǎn)生數(shù)據(jù)的不正確性和不一致性?在組件渲染之前就獲取到數(shù)據(jù)有什么壞影響?
當(dāng)在created鉤子函數(shù)中調(diào)用異步請(qǐng)求數(shù)據(jù)時(shí),有時(shí)可能會(huì)導(dǎo)致數(shù)據(jù)的不正確性和不一致性,以及其他潛在的問(wèn)題。下面是一些常見(jiàn)的情況:
- 渲染問(wèn)題:如果在
created鉤子函數(shù)中獲取數(shù)據(jù),而數(shù)據(jù)的加載需要一定的時(shí)間,那么在這段時(shí)間內(nèi)組件可能已經(jīng)開(kāi)始渲染,但數(shù)據(jù)尚未準(zhǔn)備好。這可能導(dǎo)致組件的初始渲染不符合預(yù)期,或者顯示空白或占位內(nèi)容。 - 依賴(lài)關(guān)系問(wèn)題:如果組件內(nèi)的其他邏輯或操作依賴(lài)于異步請(qǐng)求的數(shù)據(jù),那么在
created階段可能無(wú)法獲取到正確的數(shù)據(jù),從而影響到組件的正常運(yùn)行。例如,如果數(shù)據(jù)未能及時(shí)獲取,可能會(huì)導(dǎo)致其他方法或計(jì)算屬性出現(xiàn)錯(cuò)誤。 - 數(shù)據(jù)一致性問(wèn)題:在
created階段進(jìn)行異步請(qǐng)求數(shù)據(jù)時(shí),數(shù)據(jù)的返回時(shí)間無(wú)法確定。如果在組件的其他地方(如mounted鉤子函數(shù)、計(jì)算屬性、方法)依賴(lài)于這些數(shù)據(jù),可能會(huì)出現(xiàn)數(shù)據(jù)不一致的情況,導(dǎo)致組件的行為和顯示不一致。
因此,為了避免這些問(wèn)題,通常建議將異步請(qǐng)求數(shù)據(jù)的操作放在mounted鉤子函數(shù)中。在組件掛載到DOM之后再進(jìn)行數(shù)據(jù)請(qǐng)求,可以確保組件渲染完畢且依賴(lài)的DOM元素已經(jīng)存在,從而避免了上述問(wèn)題。
當(dāng)然,并不是所有情況下都必須將異步請(qǐng)求放在mounted鉤子函數(shù)中。在某些特定情況下,例如數(shù)據(jù)獲取是必須的前置條件,且可以通過(guò)其他方式解決渲染和依賴(lài)問(wèn)題,你可以選擇在created鉤子函數(shù)中進(jìn)行數(shù)據(jù)請(qǐng)求。然而,在大多數(shù)情況下,將異步請(qǐng)求放在mounted鉤子函數(shù)中是一個(gè)更安全和可靠的選擇,以確保數(shù)據(jù)的正確性和一致性。
相關(guān)文章
vue/cli3.0腳手架部署到nginx時(shí)頁(yè)面空白的問(wèn)題及解決
這篇文章主要介紹了vue/cli3.0腳手架部署到nginx時(shí)頁(yè)面空白的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
vue3+ts實(shí)際開(kāi)發(fā)中該如何優(yōu)雅書(shū)寫(xiě)vue3語(yǔ)法
近嘗試上手 Vue3+TS+Vite,所以下面這篇文章主要給大家介紹了關(guān)于vue3+ts實(shí)際開(kāi)發(fā)中該如何優(yōu)雅書(shū)寫(xiě)vue3語(yǔ)法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10
vue 循環(huán)加載數(shù)據(jù)并獲取第一條記錄的方法
今天小編就為大家分享一篇vue 循環(huán)加載數(shù)據(jù)并獲取第一條記錄的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue的watch監(jiān)聽(tīng)器取消的方法小結(jié)
在 Vue 中,watch 監(jiān)聽(tīng)器是可以取消的,取消監(jiān)聽(tīng)器的方式取決于你是如何使用 watch 的,所以本文給大家餓介紹了vue的watch監(jiān)聽(tīng)器取消的方法,并通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下2025-02-02
vue3關(guān)于時(shí)間顯示格式化的問(wèn)題
這篇文章主要介紹了vue3關(guān)于時(shí)間顯示格式化的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
vue.draggable實(shí)現(xiàn)表格拖拽排序效果
這篇文章主要為大家詳細(xì)介紹了vue.draggable實(shí)現(xiàn)表格拖拽排序效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
詳解Vue.js項(xiàng)目API、Router配置拆分實(shí)踐
這篇文章主要介紹了詳解Vue.js項(xiàng)目API、Router配置拆分實(shí)踐,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
如何用electron把vue項(xiàng)目打包為桌面應(yīng)用exe文件
這篇文章主要介紹了如何用electron把vue項(xiàng)目打包為桌面應(yīng)用exe文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05

