Vue學習筆記-生命周期與鉤子函數(shù)

vue生命周期簡介

生命周期探究

<template>
    <div id="app">
         <p>{{ message }}</p>
    </div>
</template>

<script type="text/javascript">
  var app = new Vue({
      el: '#app',
      data: {
          message : "xuxiao is boy" 
      },
       beforeCreate: function () {
                console.group('beforeCreate 創(chuàng)建前狀態(tài)===============》');
               console.log("%c%s", "color:red" , "el     : " + this.$el); //undefined
               console.log("%c%s", "color:red","data   : " + this.$data); //undefined 
               console.log("%c%s", "color:red","message: " + this.message)  
        },
        created: function () {
            console.group('created 創(chuàng)建完畢狀態(tài)===============》');
            console.log("%c%s", "color:red","el     : " + this.$el); //undefined
               console.log("%c%s", "color:red","data   : " + this.$data); //已被初始化 
               console.log("%c%s", "color:red","message: " + this.message); //已被初始化
        },
        beforeMount: function () {
            console.group('beforeMount 掛載前狀態(tài)===============》');
            console.log("%c%s", "color:red","el     : " + (this.$el)); //已被初始化
            console.log(this.$el);
               console.log("%c%s", "color:red","data   : " + this.$data); //已被初始化  
               console.log("%c%s", "color:red","message: " + this.message); //已被初始化  
        },
        mounted: function () {
            console.group('mounted 掛載結束狀態(tài)===============》');
            console.log("%c%s", "color:red","el     : " + this.$el); //已被初始化
            console.log(this.$el);    
               console.log("%c%s", "color:red","data   : " + this.$data); //已被初始化
               console.log("%c%s", "color:red","message: " + this.message); //已被初始化 
        },
        beforeUpdate: function () {
            console.group('beforeUpdate 更新前狀態(tài)===============》');
            console.log("%c%s", "color:red","el     : " + this.$el);
            console.log(this.$el);   
               console.log("%c%s", "color:red","data   : " + this.$data); 
               console.log("%c%s", "color:red","message: " + this.message); 
        },
        updated: function () {
            console.group('updated 更新完成狀態(tài)===============》');
            console.log("%c%s", "color:red","el     : " + this.$el);
            console.log(this.$el); 
               console.log("%c%s", "color:red","data   : " + this.$data); 
               console.log("%c%s", "color:red","message: " + this.message); 
        },
        beforeDestroy: function () {
            console.group('beforeDestroy 銷毀前狀態(tài)===============》');
            console.log("%c%s", "color:red","el     : " + this.$el);
            console.log(this.$el);    
               console.log("%c%s", "color:red","data   : " + this.$data); 
               console.log("%c%s", "color:red","message: " + this.message); 
        },
        destroyed: function () {
            console.group('destroyed 銷毀完成狀態(tài)===============》');
            console.log("%c%s", "color:red","el     : " + this.$el);
            console.log(this.$el);  
               console.log("%c%s", "color:red","data   : " + this.$data); 
               console.log("%c%s", "color:red","message: " + this.message)
        }
    })
</script>

create 和 mounted 相關

beforecreated:el 和 data 并未初始化
created:完成了 data 數(shù)據(jù)的初始化,el沒有
beforeMount:完成了 el 和 data 初始化
mounted:完成掛載
示例

update 相關

在 chrome console里執(zhí)行以下命令

app.message= 'yes !! I do';

下面就能看到data里的值被修改后,將會觸發(fā)update的操作。

示例2

destroy 相關

有關于銷毀,暫時還不是很清楚。我們在console里執(zhí)行下命令對 vue實例進行銷毀。銷毀完成后,我們再重新改變message的值,vue不再對此動作進行響應了。但是原先生成的dom元素還存在,可以這么理解,執(zhí)行了destroy操作,后續(xù)就不再受vue控制了。

app.$destroy();
示例3

鉤子函數(shù)詳解:

  1. beforeCreate
    官方說明:在實例初始化之后,數(shù)據(jù)觀測(data observer) 和 event/watcher 事件配置之前被調(diào)用。
    解釋:注意是 之前,這個時期,this變量還不能使用,在data下的數(shù)據(jù),和methods下的方法,watcher中的事件都不能獲得到;這個時候的vue實例還什么都沒有,但是$route對象是存在的,可以根據(jù)路由信息進行重定向之類的操作。

     beforeCreate() {
       console.log(this.page); // undefined
       console.log{this.showPage); // undefined
     },
     data() {
       return {
         page: 123
       }
     },
     methods: {
       showPage() {
         console.log(this.page);
       }
     }
    
  2. created
    官方說明:在實例已經(jīng)創(chuàng)建完成之后被調(diào)用。在這一步,實例已完成以下配置:數(shù)據(jù)觀測(data observer) ,屬性和方法的運算, watch/event 事件回調(diào)。然而,掛載階段還沒開始,el屬性目前不可見。 **解釋說明:** 這個時候可以操作vue實例中的數(shù)據(jù)和各種方法,但是還不能對"dom"節(jié)點進行操作;此時 this.data 可以訪問,watcher、events、methods也出現(xiàn)了,若根據(jù)后臺接口動態(tài)改變data和methods的場景下,可以使用。

     created() {
       console.log(this.page); // 123
       console.log{this.showPage); // ...
       $('select').select2(); // jQuery插件需要操作相關dom,不會起作用
     },
     data() {
       return {
         page: 123
       }
     },
     methods: {
       showPage() {
         console.log(this.page);
       }
     }
    
  3. beforeMounte
    官方說明:在掛載開始之前被調(diào)用:相關的 render 函數(shù)首次被調(diào)用。

    解釋說明:但是render正在執(zhí)行中,此時DOM還是無法操作的。我打印了此時的vue實例對象,相比于created生命周期,此時只是多了一個$el的屬性,然而其值為undefined。頁面渲染時所需要的數(shù)據(jù),應盡量在這之前完成賦值。

  4. mounted
    官方說明:el 被新創(chuàng)建的 vm.$el 替換,并掛載到實例上去之后調(diào)用該鉤子。如果root實例掛載了一個文檔內(nèi)元素,當 mounted 被調(diào)用時 vm.$el 也在文檔內(nèi)。

    解釋說明:掛載完畢,這時dom節(jié)點被渲染到文檔內(nèi),一些需要dom的操作在此時才能正常進行。此時元素已經(jīng)渲染完成了,依賴于DOM的代碼就放在這里吧~比如監(jiān)聽DOM事件。

     mounted() {
       $('select').select2(); // jQuery插件可以正常使用
     },
    

5.beforeUpdate

官方說明:$vm.data更新之后,虛擬DOM重新渲染 和打補丁之前被調(diào)用。

解釋說明:可以在這個鉤子中進一步地修改$vm.data,這不會觸發(fā)附加的重渲染過程。

6.updated

官方說明:****虛擬DOM重新渲染 和打補丁之后被調(diào)用。

解釋說明:當這個鉤子被調(diào)用時,組件DOM的data已經(jīng)更新,所以你現(xiàn)在可以執(zhí)行依賴于DOM的操作。但是不要在此時修改data,否則會繼續(xù)觸發(fā)beforeUpdate、updated這兩個生命周期,進入死循環(huán)!

7.beforeDestroy

官方說明:實例被銷毀之前調(diào)用。

解釋說明:在這一步,實例仍然完全可用。實例要被銷毀了,在被銷毀之前做一些校驗和判斷。

8.destroyed

官方說明:Vue實例銷毀后調(diào)用。

解釋說明:此時,Vue實例指示的所有東西已經(jīng)解綁定,所有的事件監(jiān)聽器都已經(jīng)被移除,所有的子實例也已經(jīng)被銷毀。這時候能做的事情已經(jīng)不多了,只能加點兒提示toast之類的東西吧。

總結

beforecreate : 頁面加載完成之前,可以在這里加個loading事件

created :在這結束loading,還做一些初始化,實現(xiàn)函數(shù)自執(zhí)行

mounted : 在這發(fā)起后端請求,拿回數(shù)據(jù),配合路由鉤子做一些事情

beforeDestroy: 銷毀之前使用

destroyed :當前組件已被刪除,清空相關內(nèi)容

PS:beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed這幾個鉤子函數(shù),在服務器端渲染期間不被調(diào)用。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內(nèi)容