第二式 拳打vue3生命周期

經(jīng)過(guò)上一式的學(xué)習(xí),我相信大家已經(jīng)會(huì)創(chuàng)建一個(gè)vite項(xiàng)目了,并且知道如何運(yùn)行,如何打包,如何查看打包的內(nèi)容,那么本章節(jié)會(huì)教給大家第二式。

一點(diǎn)點(diǎn)的小提醒

插件風(fēng)云

有些童鞋們可能之前插件用的是Vetur(這個(gè)適合vue),那么運(yùn)行vue3+ts的項(xiàng)目的時(shí)候可能會(huì)存在一點(diǎn)小報(bào)錯(cuò),這里建議大家禁用Vetur,使用Volar。

關(guān)于引入模塊報(bào)錯(cuò)

main.js發(fā)現(xiàn)引入了app.vue會(huì)報(bào)錯(cuò)的。這里我建議你在根目錄新建一個(gè)env.d.ts文件,關(guān)于報(bào)錯(cuò)的原因,網(wǎng)上統(tǒng)一的解釋就是ts無(wú)法識(shí)別出了ts文件的vue文件。
解決方案:

// <reference types="vite/client" />
// vue3 報(bào)錯(cuò)提示 找不到模塊“./XXX.vue”或其相應(yīng)的類型聲明
// 報(bào)錯(cuò)原因:typescript 只能理解 .ts 文件,無(wú)法理解 .vue文件
declare module '*.vue' {
  import type { DefineComponent } from 'vue'
  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
  const component: DefineComponent<{}, {}, any>
  export default component
}

vue3生命周期

什么是生命周期

Vue 中的每個(gè)組件都會(huì)經(jīng)歷從創(chuàng)建掛載更新再到銷毀這幾個(gè)階段,而在這些階段中,Vue 會(huì)運(yùn)行一種叫做生命周期鉤子的函數(shù),方便我們?cè)谔囟ǖ碾A段有機(jī)會(huì)添加上我們自己的代碼。

生命周期有哪些階段

Vue 生命周期總共可以分為 8 各階段:創(chuàng)建前后掛載前后、更新前后、銷毀前后,以及一些特殊場(chǎng)景的生命周期(keep-alive 激活時(shí)(activated)未激活時(shí)(deactivated)捕獲后代組件錯(cuò)誤時(shí)(errorCaptured))。Vue3 中還新增了三個(gè),用于調(diào)試和服務(wù)端渲染場(chǎng)景。

僅在開發(fā)模式下使用

onRenderTracked()

onRenderTriggered()

服務(wù)端渲染

onServerPrefetch()只在服務(wù)端渲染中執(zhí)行

Vue生命周期的流程

vue2的生命周期,我相信大家已經(jīng)都記得非常清楚了,在 Vue3 中的變化 絕大多數(shù)只要加上前綴 on 即可,比如 mounted 變?yōu)?onMounted,除了 beforeDestroydestroyed 被重新命名為 beforeUnmountunMounted
全部的生命周期,我這里也就不多寫了,唯一還要提醒的是,setup 是比 created 先執(zhí)行的; 而且沒(méi)有 beforeCreatecreated。那么這個(gè)setup實(shí)際上就是data和methods。而這些生命周期分別用來(lái)干些什么,和vue2并無(wú)明顯的差別。

生命周期演示過(guò)程

<template>
  <div>這是第一個(gè)組件</div>
</template>
<script lang="ts">
import { defineComponent,onBeforeMount,onMounted } from 'vue';
export default defineComponent({
  setup(){
   console.log('什么時(shí)候執(zhí)行')
   onBeforeMount(()=>{
    console.log('執(zhí)行了onBeforeMount')
   })
   onMounted(()=>{
    console.log('執(zhí)行了onMounted')
   })
  }

})
</script>
<style>
</style>

解析:其實(shí)大家不難看出來(lái),上面代碼的寫法和平時(shí)寫vue2是的寫法有哪里不一樣。第一點(diǎn)就是script標(biāo)簽里面加上了ts,那這里有一些熟悉vue3+ts的可能會(huì)說(shuō),上面的寫法為什么不加上setup(ps:這里我暫時(shí)不用語(yǔ)法糖去寫,方便大家最早的知道初始的寫法)。第二點(diǎn),我們想使用一些函數(shù),這里是生命周期,都需要引入一下。第三點(diǎn),就是非常顯眼的setup函數(shù)了。

上述代碼運(yùn)行的結(jié)果就是:setup>onBeforeMount>onMounted

兩百斤反骨

你以為真的不會(huì)寫完整生命周期嗎,那你就錯(cuò)了,都寫到這了,不給個(gè)小贊贊么。

1、setup(): 開始創(chuàng)建組件之前,在 beforeCreate 和 created 之前執(zhí)行,創(chuàng)建的是 data 和 method

2、onBeforeMount() : 組件掛載到節(jié)點(diǎn)上之前執(zhí)行的函數(shù),可以檢查dom是否被正確渲染,也可以定義一些dom操作,比如給某個(gè)元素設(shè)置屬性,添加一些事件等

3、onMounted(): 組件掛載完成后執(zhí)行的函數(shù),組件掛載時(shí)調(diào)用 可以訪問(wèn)數(shù)據(jù)、dom 元素、子組件等

4、onBeforeUpdate(): 組件更新之前執(zhí)行的函數(shù),更新前調(diào)用 此時(shí) view 層還未更新,可用于獲取更新前的各種狀態(tài)

5、onUpdated(): 組件更新完成之后執(zhí)行的函數(shù),完成更新時(shí)調(diào)用 此時(shí)view層已經(jīng)完成更新,所有狀態(tài)已經(jīng)是最新的了

6、onBeforeUnmount(): 組件卸載之前執(zhí)行的函數(shù),實(shí)例被銷毀前調(diào)用,可用于一些定時(shí)器或訂閱的取消

7、onUnmounted(): 組件卸載完成后執(zhí)行的函數(shù),銷毀一個(gè)實(shí)例時(shí)調(diào)用 可以清理與其他實(shí)例的鏈接,解綁它的全部指令以及事件監(jiān)聽器

8、onActivated(): 被包含在 <keep-alive> 中的組件,會(huì)多出兩個(gè)生命周期鉤子函數(shù),被激活時(shí)執(zhí)行;

9、onDeactivated(): 比如從 A 組件,切換到 B 組件,A 組件消失時(shí)執(zhí)行;

10、onErrorCaptured(): 當(dāng)捕獲一個(gè)來(lái)自子孫組件的異常時(shí)激活鉤子函數(shù);

11、onRenderTracked():渲染的時(shí)候可以追蹤到;

12、onRenderTriggered():重新渲染的時(shí)候觸發(fā);

13、onServerPrefetch():此鉤子僅在服務(wù)器端渲染期間調(diào)用,可用于執(zhí)行僅服務(wù)器數(shù)據(jù)獲取。

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