Vue的生命周期一起來看看
1. 生命周期(重要)
1.1 初步認識生命周期
- 別名:生命周期回調(diào)函數(shù)、生命周期函數(shù)、生命周期鉤子。
- 生命周期是什么?Vue在關鍵時刻幫我們調(diào)用的一些特殊名稱的函數(shù)。
- 生命周期函數(shù)的名字不可更改,但函數(shù)內(nèi)部的具體內(nèi)容由程序員自行編寫
- 生命周期函數(shù)中的this指向也是vm 或 組件實例對象。
1.2 生命周期流程(8個)
1.初始化
? 1.beforeCreate()
? 2.created()
2.掛載(頁面渲染)
? 1.beforeMount()
? 2.mounted()
3.更新
? 1.beforeUpdate()
? 2.updated()
4.銷毀
? 1.beforeDestory()
? 2.destoryed()
1.3 生命周期詳細流程圖
1.4 常用的生命周期鉤子:
beforeCreate()
:可以配置全局事件總線,后面會講到先提一嘴
mounted()
: 可以在此階段發(fā)送ajax請求, 啟動定時器、綁定自定義事件、訂閱消息等異步任務【初始化操作】
beforeDestroy()
: 在此階段做收尾工作, 如: 清除定時器、解綁自定義事件、取消訂閱消息等【首尾工作】
1.4.1 關于銷毀
- 銷毀后借助Vue開發(fā)者工具看不到任何信息
- 銷毀后自定義事件會失效,但原生DOM事件依然有效
- 一般不會在
beforeDestroy
操作數(shù)據(jù),因為即使操作數(shù)據(jù),也不會再觸發(fā)更新流程了。
1.4.2 關于父子組件的生命周期
1.加載渲染的過程
父beforeCreate ==> 父created ==> 父beforeMount ==> 子beforeCreate ==> 子created ==> 子beforeMount ==> 子mounted ==> 父mounted
2.更新的過程
父beforeUpdate ==> 子beforeUpdate ==> 子updated ==> 父updated
3.銷毀過程
父beforeDestroy ==> 子beforeDestroy ==> 子destroyed ==> 父destroyed
1.5小案例
<div id="root"> <!-- 讓h3透明度產(chǎn)生過渡的效果 --> <h3 :style="{opacity:opacity}">歡迎學習Vue!</h3> <button @click="des">點擊我銷毀</button> </div> <script> Vue.config.productionTip = false let vm = new Vue({ el: '#root', data: { opacity: 1 }, methods: { des(){ // 觸發(fā)此函數(shù)必定調(diào)用,beforeDestroy(),destroyed() this.$destroy() } }, mounted() { //掛載 /* - 完成模板解析后并且將初始的真實的DOM元素掛載到頁面后,才執(zhí)行的函數(shù) 只會執(zhí)行一次 - this指向Vue - 開發(fā)中常用的方法,當我們想要讀取某個屬性但是讀不到,就可以 將該屬性綁定到共同能夠訪問到的元素上,例如下面定時器的例子 */ this.timer = setInterval(() => { this.opacity -= 0.01 if (this.opacity <= 0) this.opacity = 1 }, 10); }, beforeDestroy() { console.log("beforeDestroy - 清除定時器"); clearInterval(this.timer) }, destroyed() { console.log("destroyed - 銷毀完畢") }, }) </script>
1.6 代碼舉例說明生命周期鉤子
<div id="root"> <h3>n的值為:{{n}}</h3> <button @click="add">點擊我n+1</button> <button @click="remove">點擊銷毀vm</button> </div> <script> Vue.config.productionTip = false let vm = new Vue({ el: '#root', data: { n:1 }, methods: { add(){ this.n++ }, remove(){ this.$destroy() } }, beforeCreate() { /* 此時初始化生命周期,事件等,數(shù)據(jù)代理還未開始 vm無法訪問到data中的數(shù)據(jù),methods中的方法 */ console.log("beforeCreate"); //console.log(this.n); //undefined // console.log(this.add()); // this.add is not a function // debugger }, created() { /* 已經(jīng)完成了初始化的數(shù)據(jù)監(jiān)視和數(shù)據(jù)代理 vm可以訪問到data中的數(shù)據(jù)和methods的方法 */ console.log("created"); // console.log(this.n); // 1 // console.log(this.add()); // undefined // debugger }, beforeMount() { /* 掛載之前,也就是圖中的判斷框里執(zhí)行的,此階段是Vue 在解析模板并且生成虛擬DOM存儲在內(nèi)存當中,頁面還不能 看到解析后的樣子 */ console.log("beforeMount"); // debugger }, mounted() { /* 完成模板解析后并且將初始的真實的DOM元素掛載到頁面后,才執(zhí)行的函數(shù) 一般在此:開啟一些定時器、發(fā)送網(wǎng)絡請求、訂閱消息、 綁定自定義事件等等初始化 */ console.log("mounted"); // debugger }, beforeUpdate() { /* 當數(shù)據(jù)發(fā)生更新后,此時數(shù)據(jù)已經(jīng)更新完成,但是頁面 還是未更新的。 也就是面試所問的:頁面和尚未和數(shù)據(jù)保持同步的階段 */ console.log("beforeUpdate"); }, updated() { /* 在這之前會進行新舊虛擬DOM比較,最終完成頁面的更新 此階段就是頁面和數(shù)據(jù)保持同步 */ console.log("updated"); }, beforeDestroy() { /* 當我們調(diào)用vm.$destroy時,才會執(zhí)行下面兩個函數(shù), 馬上要執(zhí)行銷毀階段,一般在這個階段做一些收尾操作 比如:關掉定時器,取消訂閱,解綁自定義事件 */ console.log("beforeDestroy"); }, destroyed() { /* 所有的指令,所有的自定義事件監(jiān)聽器都沒了(只留下原生的dom的事件) */ console.log("destroyed"); }, }) </script>
總結(jié)
以上就是今天要講的內(nèi)容,本文介紹了生命周期的相關知識,希望對大家有所幫助!
相關文章
vue3.0中使用Element-Plus中Select下的filter-method屬性代碼示例
這篇文章主要給大家介紹了關于vue3.0中使用Element-Plus中Select下的filter-method屬性的相關資料,Filter-method用法是指從一組數(shù)據(jù)中選擇滿足條件的項,文中通過圖文以及代碼介紹的非常詳細,需要的朋友可以參考下2023-12-12vue-router(this.$router)如何在新窗口打開路由跳轉(zhuǎn)頁面
這篇文章主要介紹了vue-router(this.$router)如何在新窗口打開路由跳轉(zhuǎn)頁面問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12