Vue生命周期詳解

什么是Vue的生命周期

先看一看官方文檔對Vue生命周期的說明:

每個 Vue 實例在被創(chuàng)建時都要經(jīng)過一系列的初始化過程——例如末融,需要設(shè)置數(shù)據(jù)監(jiān)聽然评、編譯模板、將實例掛載到 DOM 并在數(shù)據(jù)變化時更新 DOM 等妖泄。同時在這個過程中也會運行一些叫做生命周期鉤子的函數(shù)平挑,這給了用戶在不同階段添加自己的代碼的機會。

簡單來說就是Vue實例和組件在被創(chuàng)建的時候所經(jīng)歷的過程惨恭,Vue通過生命周期鉤子將這些過程暴露出來秉馏,方便開發(fā)者針對組件的狀態(tài)做出編碼

Vue生命周期的順序

beforeCreate->created->beforeMount->mounted->beforeDestroy->destroyed
下面用代碼展示一下:
子組件用來顯示生命周期:

<template>
  <div>
    {{msg}}
    <button @click="msg='組件更新了'">更新組件內(nèi)容</button>
  </div>

</template>
<script>
export default {
  name: 'HelloWorld',
  data(){
    return {
      msg:"測試"
    }
  },
  beforeCreate() {
    console.log("組件創(chuàng)建前-beforeCreate")
  },
  created() {
    console.log("組件創(chuàng)建后-created")
  },
  beforeMount() {
    console.log("組件掛載前-beforeMount")
  },
  mounted() {
    console.log("組件掛載完成-mounted")
  },
  beforeDestroy() {
    console.log("組件銷毀前-beforeDestroy")
  },
  destroyed() {
    console.log("組件銷毀-destroyed")
  },
  beforeUpdate() {
    console.log("組件更新前-beforeUpdate")
  },
  updated() {
    console.log("組件更新后-updated")
  }
}
</script>

父組件用來銷毀子組件:

<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <button @click="deleteZ()">銷毀組件</button>
    <HelloWorld v-if="helloShow" msg="Welcome to Your Vue.js App"/>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'app',
  components: {
    HelloWorld
  },
  data(){
    return {
      helloShow:true
    }
  },
  methods:{
    deleteZ(){
      this.helloShow = !this.helloShow;
    }
  }
}
</script>

項目啟動之后如圖:


控制臺打印如下:

可以看到一共觸發(fā)了4個生命周期,beforeCreate, created,beforeMount,mounted

點擊更新組件內(nèi)容按鈕之后:


可以看到控制臺又打印了兩條記錄脱羡,觸發(fā)了組件的beforeUpdate,updated
最后點擊銷毀組件按鈕:

可以看到觸發(fā)了銷毀的生命周期萝究,至此,Vue的8個生命周期全部跑完锉罐,下面將對每個生命周期進行詳細分析

Vue生命周期詳解

1.beforeCreate

作為Vue實例創(chuàng)建過程中的第一個生命周期糊肤,它到底有什么用那?還記得有次面試氓鄙,面試官問我馆揉,“這個boforeCreate有什么用那?” 我想了想抖拦,就說“沒有什么用啊”升酣,然后就沒有然后了,所以我特地去查了查态罪,發(fā)現(xiàn)確實并沒有什么卵用噩茄,可能是太菜了吧,如果有大佬讀到這篇文章复颈,還望評論告訴我一下它到底有啥用绩聘!

我們還是看看這個生命周期鉤子可以訪問到實例的那些內(nèi)容吧!
修改剛才寫的beforeCreate生命周期鉤子函數(shù):

  beforeCreate() {
    console.log("組件創(chuàng)建前-beforeCreate")
    console.log(this);
    console.log(this.$el);
    console.log(this.$data);
    console.log(this.msg);
  }

運行效果:


可以看到在beforeCreate中只能訪問到this耗啦,也就是Vue實例凿菩,data和DOM都不能拿到,所以不能去修改data和操作DOM帜讲,如果非要去操作衅谷,可以用$nextTick等DOM渲染完成之后操作

2.created

繼續(xù)修改代碼:

  created() {
    console.log("組件創(chuàng)建后-created")
    console.log(this);
    console.log(this.$el);
    console.log(this.$data);
    console.log(this.msg);
  }

我們看一看控制臺打印:


可以看到在這個生命周期鉤子中已經(jīng)可以訪問到data中定義的數(shù)據(jù)似将,可以進行初始數(shù)據(jù)的獲取获黔,在這里更改數(shù)據(jù)不會觸發(fā)beforeUpdate,updated兩個生命周期鉤子(同步的情況下)蚀苛,異步更改data數(shù)據(jù)就要看走起是否已經(jīng)走到mounted生命周期了,如果走到mounted生命周期玷氏,就會觸發(fā)更新

3.beforeMount

接著修改代碼:

  beforeMount() {
    console.log("組件掛載前-beforeMount");
    console.log(this);
    console.log(this.$el);
    console.log(this.$data);
    console.log(this.msg);
  }


從控制臺的打印來看堵未,似乎和created生命周期打印的東西差不多?╮( ̄▽ ̄)╭盏触,其實不然渗蟹,在這個生命周期鉤子觸發(fā)的時候,虛擬DOM已經(jīng)創(chuàng)建完成耻陕,馬上就要渲染了拙徽,在這里更改數(shù)據(jù)依然不會觸發(fā)更新的生命周期,情況和created一樣

4.mounted

我們再來看一看mounted生命周期:

  mounted() {
    console.log("組件掛載完成-mounted")
    console.log(this);
    console.log(this.$el);
    console.log(this.$data);
    console.log(this.msg);
  }

控制臺打邮:


可以看到在mounted生命周期鉤子觸發(fā)的時候膘怕,真實的DOM已經(jīng)渲染完成,組件已經(jīng)完全渲染完成召庞,在此處更改data就會觸發(fā)更新

5.beforeUpdate和updated

當vue發(fā)現(xiàn)data中的數(shù)據(jù)發(fā)生了改變岛心,會觸發(fā)對應(yīng)組件的重新渲染,先后調(diào)用beforeUpdateupdated鉤子函數(shù)篮灼。切記忘古,千萬不要在beforeUpdateupdated鉤子函數(shù)中更改data的數(shù)據(jù),否則會進入死循環(huán)诅诱!

6.beforeDestroy和destroyed

beforeDestroy鉤子函數(shù)在實例銷毀之前調(diào)用髓堪。在這一步,實例仍然完全可用娘荡「膳裕可以用來清除一些定時器,或者做一些狀態(tài)的保存
destroyed鉤子函數(shù)在Vue 實例銷毀后調(diào)用炮沐。調(diào)用后争群,Vue 實例指示的所有東西都會解綁定,所有的事件監(jiān)聽器會被移除大年,所有的子實例也會被銷毀换薄。也就是說這個組件木得了

至此,Vue的生命周期鉤子已經(jīng)說了一遍了翔试,僅代表個人理解轻要,有理解的不對的地方歡迎各位大佬指正,下面放上完整代碼

<template>
  <div id="msg">
    {{msg}}
    <button @click="msg='組件更新了'">更新組件內(nèi)容</button>
  </div>

</template>
<script>
export default {
  name: 'HelloWorld',
  data(){
    return {
      msg:"測試"
    }
  },
  beforeCreate() {
    console.log("組件創(chuàng)建前-beforeCreate")
    console.log(this);
    console.log(this.$el);
    console.log(this.$data);
    console.log(this.msg);
  },
  created() {
    console.log("組件創(chuàng)建后-created")
    console.log(this);
    console.log(this.$el);
    console.log(this.$data);
    console.log(this.msg);
    //this.msg="test"
    // setTimeout( () => {
    //   this.msg = "test2"
    // },1000)
  },
  beforeMount() {
    console.log("組件掛載前-beforeMount");
    console.log(this);
    console.log(this.$el);
    console.log(this.$data);
    console.log(this.msg);
  },
  mounted() {
    console.log("組件掛載完成-mounted")
    console.log(this);
    console.log(this.$el);
    console.log(this.$data);
    console.log(this.msg);
  },
  beforeDestroy() {
    console.log("組件銷毀前-beforeDestroy")
  },
  destroyed() {
    console.log("組件銷毀-destroyed")
  },
  beforeUpdate() {
    console.log("組件更新前-beforeUpdate")
  },
  updated() {
    console.log("組件更新后-updated")
  }
}
</script>

再放上生命周期圖示

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遏餐,一起剝皮案震驚了整個濱河市伦腐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌失都,老刑警劉巖柏蘑,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異粹庞,居然都是意外死亡咳焚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門庞溜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來革半,“玉大人,你說我怎么就攤上這事流码∮止伲” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵漫试,是天一觀的道長六敬。 經(jīng)常有香客問我,道長驾荣,這世上最難降的妖魔是什么外构? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮播掷,結(jié)果婚禮上审编,老公的妹妹穿的比我還像新娘。我一直安慰自己歧匈,他們只是感情好垒酬,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著件炉,像睡著了一般勘究。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妻率,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天乱顾,我揣著相機與錄音,去河邊找鬼宫静。 笑死走净,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的孤里。 我是一名探鬼主播伏伯,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼捌袜!你這毒婦竟也來了说搅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤虏等,失蹤者是張志新(化名)和其女友劉穎弄唧,沒想到半個月后适肠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡候引,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年侯养,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澄干。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡逛揩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出麸俘,到底是詐尸還是另有隱情辩稽,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布从媚,位于F島的核電站逞泄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏静檬。R本人自食惡果不足惜炭懊,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拂檩。 院中可真熱鬧侮腹,春花似錦、人聲如沸稻励。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽望抽。三九已至硼身,卻和暖如春耍缴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工跪另, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留日月,地道東北人廓脆。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓之宿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸠窗。 傳聞我的和親對象是個殘疾皇子妓羊,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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