不來看看這些 VUE 的生命周期鉤子函數?|原力計劃 - CSDN

2021-01-08 CSDN

作者 | huangfuyk

責編 | 王曉曼

出品 | CSDN 博客

VUE的生命周期鉤子函數:就是指在一個組件從創建到銷毀的過程自動執行的函數,包含組件的變化。可以分為:創建、掛載、更新、銷毀四個模塊。

註:在組件的整個生命周期內,鉤子函數都是可被自動調用的,且生命周期函數的執行順序與書寫的順序無關。

圖示:

BeforeCreate

該函數執行在組件創建、數據觀測 (data observer) 和 event/watcher 事件配置之前,實例初始化之後被調用。

在該階段組件未創建,不能訪問數據,組件中的 data,ref 均為 undefined。

Created

該函數在組件創建完成後被立即調用,在這一步,實例已完成以下的配置:數據觀測 (data observer),屬性和方法的運算,watch/event 事件回調。

但是還未渲染成HTML模板,組件中的data對象已經存在,可以對data進行操作了,即可以訪問數據,發請求,ref依舊是undefined,掛載階段還沒開始,$el 屬性目前尚不可用。

一般我們可以將對數據的初始化和初始化頁面的請求放到裡面,結束loading。

Created 實例:

1、RAP2 模擬一個後端接口(http://rap2.taobao.org:38080/app/mock/252122/test),使用 created 拿數據。

2、RAP2操作界面如下:

3、代碼:

<divid="box"><ul><liv-for="item in list":key="item.id">{{item.name}}</li></ul></div><script>new Vue({el:"#box",data:{list:[] }, created(){ fetch('http://rap2.taobao.org:38080/app/mock/252122/test') .then(res=>res.json()) .then((res)=>{if(res.code===200){this.list = res.data.list; } }) }, beforeCreate(){ }, })</script>

4、結果

BeforeMount

該函數在組件掛載之前,在該階段頁面上還沒渲染出 HTML 元素,data 初始化完成,ref 依舊不可以操作,相關的 render 函數首次被調用。

可以訪問數據,編譯模板結束,虛擬 dom 已經存在。

該鉤子在伺服器端渲染期間不被調用。

Mounted

該函數是頁面完成掛載之後執行的,這時 el 被新創建的 vm.$el 替換了,就可以操作 ref 了,一般會用於將組件初始時請求數據的方法放到這裡面,filter 也是在這裡生效。

如果根實例掛載到了一個文檔內的元素上,當 mounted 被調用時 vm.$el 也在文檔內。

可以拿到數據和節點,實例被掛載後調用。

注意 :mounted 不會保證所有的子組件也都一起被掛載。如果你希望等到整個視圖都渲染完畢,可以在 mounted 內部使用 vm.$nextTick:

mounted: function () {this.$nextTick(function () {// Code that will run only after the// entire view has been rendered })}

該鉤子在伺服器端渲染期間不被調用。

1、beforeMount與mounted實例①:

(ref表示節點;this.$refs.ref的標識,就可拿到節點)

<divid="box"><divref='demo'>demo</div></div><script>new Vue({el:"#box",data:{a:666 }, mounted(){console.log('mounted',this.a); }, beforeMount(){console.log('beforeMount',this.a);console.log(this.$refs.demo); } })</script>

結果:

2、beforeMount與mounted實例②:

<divid="box"><divref='demo'>demo</div></div><script>new Vue({el:"#box",data:{a:666 }, mounted(){console.log('mounted',this.a);console.log(this.$refs.demo); }, beforeMount(){console.log('beforeMount',this.a); } })</script>

結果:

3、beforeMount與mounted實例③:

(節點掛載後,文本框自動獲取焦點)

<divid="box"><inputtype="text"ref='txt'></div><script>new Vue({el:"#box",data:{a:666, }, mounted(){console.log('mounted',this.a);this.$refs.txt.focus(); }, beforeMount(){console.log('beforeMount',this.a); } })</script>

結果:

以上兩個實例,更加有力的說明:

beforeMount執行在真實的dom節點掛載之前,此時沒有節點,所以拿不到節點。mounted執行時真實的dom節點已經掛載到頁面上了,所以能拿到節點。

例:beforeCreate、created、beforeMount、mounted執行順序差別演示:

(因為 它們此時都是對象,所以它們代碼的擺放位置是不影響結果的。)

<divid="box"></div><script>new Vue({el:"#box",data:{a:666, }, created(){console.log("created",this.a); }, beforeCreate(){console.log('beforeCreate',this.a); }, mounted(){console.log('mounted',this.a); }, beforeMount(){console.log('beforeMount',this.a); } })</script>

結果:

BeforeUpdate

該函數在數據更新時調用,發生在虛擬 DOM 打補丁之前,在有特殊需求的情況下,可以將更新之前的數據存起來,放到後面去使用。

這裡適合在更新之前訪問現有的 DOM,比如手動移除已添加的事件監聽器。

該鉤子在伺服器端渲染期間不被調用,因為只有初次渲染會在服務端進行。

Updated

由於數據更改導致的虛擬 DOM 重新渲染和打補丁,在這之後會調用該鉤子,在數據更新之後做一些處理,即監控數據的變化。

當這個鉤子被調用時,組件 DOM 已經更新,所以你現在可以執行依賴於 DOM 的操作。然而在大多數情況下,你應該避免在此期間更改狀態。如果要相應狀態改變,通常最好使用計算屬性或 watcher 取而代之。

注意 :updated 不會保證所有的子組件也都一起被重繪。如果你希望等到整個視圖都重繪完畢,可以在 updated 裡使用 vm.$nextTick:

updated: function () {this.$nextTick(function () {// Code that will run only after the// entire view has been re-rendered })}

該鉤子在伺服器端渲染期間不被調用。

注意:

watch是監控特定數據的變化,而updated是監控組件裡所有數據的變化。

例:beforeUpdate與updated執行演示:

<body><divid="box"><inputtype="range"min="1"max="100"v-model="n" /><Com:n="n"></Com></div><script>var Com = {props:["n"],template: `<div>{{n}}</div>`,//這兩個鉤子會在數據更新時被調用 beforeUpdate(){console.log("beforeUpdate") }, updated(){console.log("updated") } };new Vue({el: '#box',components: { Com, },data:{n:1 } });</script>

結果:

BeforeDestroy

該函數在實例銷毀之前調用,這裡的 ref 依舊可以操作,實例仍然完全可用,可以在這裡做清除定時器的操作,防止內存洩漏。

該鉤子在伺服器端渲染期間不被調用。

Destroyed

該函數在組件銷毀的時候執行,即實例銷毀後調用,這裡的 ref 不存在。

該鉤子被調用後,對應 Vue 實例的所有指令都被解綁,所有的事件監聽器被移除,所有的子實例也都被銷毀。

該鉤子在伺服器端渲染期間不被調用。

例:beforeDestroy與destroyed執行演示:

(this.$destroy()可以銷毀組件)

<divid="box"><Com></Com></div><script>var Com = {template: `<div> <button @click="kill">kill</button> </div>`, mounted() {this.timer = setInterval(()=>{console.log("hello"); },1000) }, beforeDestroy(){ clearInterval(this.timer);console.log("beforeDestory") }, destroyed(){console.log("destoryed") },methods:{ kill(){ //銷毀組件this.$destroy() } } };new Vue({el: '#box',components: { Com, }, });</script>

結果:

註:組件進行銷毀的時候,是先銷毀的是父組件,然後銷毀子組件。

Activated

被 keep-alive 緩存的組件激活時調用。

該鉤子在伺服器端渲染期間不被調用。

Deactivated

被 keep-alive 緩存的組件停用時調用。

該鉤子在伺服器端渲染期間不被調用。

例:activated與deactivated執行演示:

<divid="box"><keep-alive><component:is="cName"></component></keep-alive><button @click="cName='One'">change1</button><button @click="cName='Two'">change2</button></div><script>var One ={template:`<div>one component</div>`, activated(){console.log("activated"); }, deactivated(){console.log("deactivated"); } }var Two ={template:`<div>two component</div>`, }new Vue({el:"#box",components:{ One,Two },data:{cName:'One'//存組件的名字 } })</script>

結果:

ErrorCaptured

類型:(err: Error, vm: Component, info: string) => ?boolean。

當捕獲一個來自子孫組件的錯誤時被調用。此鉤子會收到三個參數:錯誤對象、發生錯誤的組件實例以及一個包含錯誤來源信息的字符串。此鉤子可以返回 false 以阻止該錯誤繼續向上傳播。

我們可以在此鉤子中修改組件的狀態。因此在捕獲錯誤時,在模板或渲染函數中有一個條件判斷來繞過其它內容就很重要;不然該組件可能會進入一個無限的渲染循環。

默認情況下,如果全局的 config.errorHandler 被定義,所有的錯誤仍會發送它,因此這些錯誤仍然會向單一的分析服務的地方進行匯報。如果一個組件的繼承或父級從屬鏈路中存在多個 errorCaptured 鉤子,則它們將會被相同的錯誤逐個喚起。如果此 errorCaptured 鉤子自身拋出了一個錯誤,則這個新錯誤和原本被捕獲的錯誤都會發送給全局的config.errorHandler。一個 errorCaptured 鉤子能夠返回 false以阻止錯誤繼續向上傳播。本質上是說「這個錯誤已經被搞定了且應該被忽略」。它會阻止其它任何會被這個錯誤喚起的 errorCaptured鉤子和全局的 config.errorHandler。版權聲明:本文為CSDN博主「huangfuyk」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_42881768/article/details/105747563

相關焦點

  • Vue框架之生命周期鉤子
    學習計劃安排如下:Vue的深入學習,emm準確地說還不能算是深入學習,我有點高估自己的學習進度了。本來打算兩天時間做一個基礎入門的,畢竟教程也就一天的內容,看來計劃趕不上變化。vue中三大常用屬性的小結、生命周期鉤子的了解,以及指令的初步接觸。指令有點多,只能留到明天繼續補全了。
  • Vue.js系列:生命周期鉤子
    開發人員提供了一個Web開發人員可以在Vue.js應用程式的整個生命周期中使用的各種方法的討論。生命周期鉤子是在Vue對象生命周期的某個階段執行的已定義方法。從初始化開始到它被破壞時,對象都會遵循不同的生命階段。這是一個著名的圖表,表示掛鈎順序。讓我們將代碼添加到鉤子並查看它們如何被解僱的階段。<!
  • vue 渲染函數插槽專題及常見問題 - CSDN
    這個組件可以通用地用於將框架包圍在wq你想要的任何內容上,來看看它是怎麼用的。這裡的frame組件指的是我們剛才做的組件。// app.vue 在開始和結束frame標記之間的內容將插入到插槽所在的frame組件中,替換slot標記。這是最基本的方法。
  • 優美的v-for列表加載動畫:vue動畫鉤子實踐
    原文轉自 優美的v-for列表加載動畫:vue動畫鉤子實踐 https://juejin.im/post/6869195042599206919最近忙完工作,重新擼了一遍vue官方文檔,發現很少被我用到的vue動畫神器,JavaScript鉤子函數
  • 如何寫一個vue組件專題及常見問題 - CSDN
    你的輸入值不可能總是 value ,你的事件不可能總是 input,具體詳見文檔sync(雙向綁定語法糖)vue 真的是方便了開發者很多,站在開發者的角度考慮,很大的提升開發效率以 update:myPropName 的模式觸發事件取代雙向綁定this.
  • vue的$nextTick的使用+源碼分析
    開始前,我覺得我們需要先弄清楚vue的$nextTick是幹什麼用的,它的存在是為了解決什麼問題?大家也可以自問一下。nextTick英文翻譯過來「下一個記號或者標記」,我覺得這裡應該用狀態來描述更加合理一些。
  • Vue 項目中哪些問題戳中你的痛點?你又是如何解決的?(更新中)
    如下圖所示:解決方法1:首先我在data函數裡面進行定義定時器名稱:然後這樣使用定時器:最後在beforeDestroy()生命周期內清除定時器:方案1有兩點不好的地方,引用尤大的話來說就是:它需要在這個組件實例中保存這個 timer,如果可以的話最好只有生命周期鉤子可以訪問到它。
  • Vue.js深入學習
    @click.stop="btnHandle" 阻止事件冒泡 從裡到外.prevent 阻止默認行為,連結跳轉,.capture 實現捕獲觸發事件的機制 從外到裡.self 只有點擊當前元素時觸發,冒泡和捕獲都不管用,.once 只觸發一次事件處理函數.stop和.self的區別.self只會阻止自己身上冒泡行為,並不會阻止其他元素的冒泡行為
  • React生命周期的正解
    關注 入坑網際網路 ,回復「加群」加入我們一起學習,天天進步前言任何一個應用程式都會有自己的完整生命周期。只有了解生命周期才有可能寫出性能更好更健壯的應用程式。當然對比後端,前端對生命周期的定義理解使用場景還是有很大區別。
  • vuex實現預熱篇-vue插件開發
    #泛舟計劃·讓知識更好看#1.如何引用vue插件呢?Vue.use(Vuex)2.use做了什麼事呢?了解了以上的用法,那麼咱就知道大概的結構怎麼寫了吧,來先構造下結構// Myplugin作為對象傳入const MyLoggerPlugin = {}// Vue 就是Vue這個構造函數,options是插件傳入的參數MyLoggerPlugin.install = function(Vue, options) {console.log(Vue, options) //輸出的就是
  • c++中槽函數 - CSDN
    它是一種函數回調機制,當一個信號關聯了多個槽時,信號發出,這些槽將會被調用,當然,也可以僅僅關聯一個槽函數。sig;第二個模板參數Combiner是一個函數對象,它被稱為『合併器』,用於組合所有槽的返回值,默認是boost::signals2::optional_last_value<R>,返回最後一個被調用的槽的返回值;第三個模板參數Group是槽編組的類型,你可以為你的槽設置不同的組,默認組的類型是int,通常情況下,不需要更改;
  • 準備將您的Vue應用遷移到Vue 3
    您也可以查看RFC文檔,以了解為什麼他們不推薦它。由於事件總線概念實際上是一種發布-訂閱模式,這是編程中的一種常用方法,因此您實際上仍然可以使用該概念,但是可以使用mitt之類的不同庫。例如:// helper/filter.jsexportfunctiontoCurrency (value) {return`$${value.toFixed(2)}`}然後,您可以將輔助函數導入到需要使用它的組件中。例如:// price-component.vueimport { toCurrency } from'.
  • 10個簡單的技巧讓你的 vue.js 代碼更優雅 - 酷扯兒
    最簡單的方法就是改寫組件的生命周期函數,使其在mounted/beforeUpdata /updatad時通知父組件顯示或者隱藏 loading。這樣做顯示不好,因為侵入了自組件的邏輯,增加的邏輯也和組件本身的功能好不關聯。
  • 尤雨溪在Vue3.0 Beta直播裡聊到了這些…
    很多時候,我們並不需要 vue提供的所有功能,在 vue 2 並沒有方式排除掉,但是 3.0 都可能做成了按需引入。5. Composition API/api.html#setupPs:其它的均為常見的工具函數,可先忽略不看。
  • 技術分享:vue 過濾器
    vue 過濾器 1 關於 vue 過濾器 在vue1.0的時候其實是內置了過濾器的,但是考慮到好多過濾器並不一定會被開發所調用,所以把原本內置的過濾器就給去掉了,但是過濾器還是比較普遍的,所以我們從vue2.0之後就需要自己定義過濾器
  • 你離黑客的距離,就差這 20 個神器 | 原力計劃
    函數調用執行流圖形模式:APIMonitor這款工具的知名度比起上面幾位要低調不少,這是一款用來監控目標進程的函數調用情況的工具,你可以監控任意你想要監控的進程,查看他們調用了哪些關鍵系統函數,以及對應的參數和返回值
  • 你離黑客的距離,就差這 20 個神器了 | 原力計劃
    函數調用執行流圖形模式:APIMonitor這款工具的知名度比起上面幾位要低調不少,這是一款用來監控目標進程的函數調用情況的工具,你可以監控任意你想要監控的進程,查看他們調用了哪些關鍵系統函數,以及對應的參數和返回值
  • 投資的生命周期-輪迴
    (一)生命周期的概念 這個概念最初是由F·莫迪利安尼和R·布倫伯格,A·安多共同創建的(其中F·莫迪利安尼由於貢獻突出,還獲得過諾貝爾經濟學獎),該理論指出,個人是在相當長時間內計劃他的消費行為和儲蓄行為,以實現生命周期內消費和儲蓄的最佳配置。
  • 如何在uni-app項目創建雲函數資料庫插入記錄
    工具HBuilderX微信開發者工具雲服務管理後臺技術vueuni-app資料庫在uni-app雲開發項目中,創建一個雲函數,然後調用雲函數,新建資料庫(雲服務)。選中雲函數,滑鼠右鍵上傳部署6、進入到雲服務管理平臺,查看雲函數是否上傳