vue生命周期鉤子函數(shù)的正確使用方式

先上圖
vue的生命周期
遇到的一個(gè)問題

在我的項(xiàng)目中击儡,常用的生命周期鉤子函數(shù)一直都是mounted袄秩,對(duì)于大部分情況现柠,都是屢試不爽苹享、捷報(bào)頻傳~

但是在前幾天卻遭遇了一個(gè)意外双絮,我在mounted中獲取后臺(tái)數(shù)據(jù)并更新data,在template中把data.fullname與一個(gè)p元素的innerHTML綁定得问,這是一個(gè)簡(jiǎn)單到不能再簡(jiǎn)單掷邦,普通到不能更普通的操作,打開瀏覽器一看椭赋,完美抚岗!fullname的數(shù)據(jù)正常顯示在p元素中,沒有任何問題哪怔,可是……咦宣蔚,控制臺(tái)怎么報(bào)錯(cuò)了?

報(bào)錯(cuò)信息

報(bào)錯(cuò)信息的大致意思是认境,data是null胚委,無(wú)法獲取到null的fullname屬性,可是數(shù)據(jù)明明正常顯示了呀叉信,而且我們不是從后臺(tái)請(qǐng)求數(shù)據(jù)并給data賦值了嘛亩冬?

經(jīng)過一番排查,發(fā)現(xiàn)原因有兩處:

  1. 初始化時(shí)硼身,給data的值是null
  data () {
    return {
      data: null,
  },
  1. vue渲染template的時(shí)間在beforeMount之后硅急,mounted之前,所以渲染template時(shí)data值為null佳遂,故而報(bào)錯(cuò)营袜;但是待后臺(tái)數(shù)據(jù)請(qǐng)求成功給data賦值后,p元素能監(jiān)聽到數(shù)據(jù)的變化丑罪,然后更新其innerHTML荚板,所以UI看起來(lái)是很正常的
解決方案

所以解決方案是非常簡(jiǎn)單的凤壁,只需要保證渲染template的時(shí)候,data已經(jīng)拿到后臺(tái)數(shù)據(jù)就可以了跪另,所以可以把mounted鉤子函數(shù)修改為beforeMount拧抖,或者其他更早被調(diào)用的鉤子函數(shù):beforeCreated、created等


后來(lái)經(jīng)過驗(yàn)證免绿,上述的解決方案是錯(cuò)誤的唧席,因?yàn)樗会槍?duì)同步代碼有效果。而ajax請(qǐng)求是異步操作针姿,回調(diào)函數(shù)的執(zhí)行時(shí)間不能確定袱吆,所以即使放在created鉤子函數(shù)中厌衙,也不能保證在mounted之前完成數(shù)據(jù)的請(qǐng)求……

所以最終的解決方案是距淫,給p標(biāo)簽加一個(gè)v-if,待data不為null時(shí)再進(jìn)行渲染婶希,但并不算很優(yōu)雅榕暇。

不知道vue的生命周期鉤子函數(shù)是否支持promise或者async/await,如果大神們有更好的解決方案喻杈,歡迎交流~

總結(jié)

一點(diǎn)小小的感悟彤枢,vue生命周期鉤子函數(shù)的使用并非一成不變的,要根據(jù)不同的應(yīng)用場(chǎng)景而有所改變筒饰,稍微總結(jié)一下:

  1. beforeCreate:在實(shí)例初始化之后缴啡,**數(shù)據(jù)觀測(cè)(data observer) ** 和 event/watcher事件配置 之前被調(diào)用,注意是 之前瓷们,此時(shí)data业栅、watcher、methods統(tǒng)統(tǒng)滴沒有谬晕。
    這個(gè)時(shí)候的vue實(shí)例還什么都沒有碘裕,但是$route對(duì)象是存在的,可以根據(jù)路由信息進(jìn)行重定向之類的操作攒钳。

  2. created:在實(shí)例已經(jīng)創(chuàng)建完成之后被調(diào)用帮孔。在這一步,實(shí)例已完成以下配置:數(shù)據(jù)觀測(cè)(data observer) 不撑,屬性和方法的運(yùn)算文兢, watch/event 事件回調(diào)。然而焕檬,掛載階段還沒開始禽作,$el屬性目前不可見。
    此時(shí) this.$data 可以訪問揩页,watcher旷偿、events烹俗、methods也出現(xiàn)了,若根據(jù)后臺(tái)接口動(dòng)態(tài)改變data和methods的場(chǎng)景下萍程,可以使用幢妄。

  3. beforeMount:在掛載開始之前被調(diào)用,相關(guān)的 render 函數(shù) 首次被調(diào)用茫负。但是render正在執(zhí)行中蕉鸳,此時(shí)DOM還是無(wú)法操作的。我打印了此時(shí)的vue實(shí)例對(duì)象忍法,相比于created生命周期潮尝,此時(shí)只是多了一個(gè)$el的屬性,然而其值為undefined饿序。
    使用場(chǎng)景我上文已經(jīng)提到了勉失,頁(yè)面渲染時(shí)所需要的數(shù)據(jù),應(yīng)盡量在這之前完成賦值原探。

  4. mounted:在掛載之后被調(diào)用乱凿。在這一步 創(chuàng)建vm.$el并替換el,并掛載到實(shí)例上咽弦。(官方文檔中的 “如果root實(shí)例掛載了一個(gè)文檔內(nèi)元素徒蟆,當(dāng)mounted被調(diào)用時(shí)vm.$el也在文檔內(nèi)” 這句話存疑)
    此時(shí)元素已經(jīng)渲染完成了,依賴于DOM的代碼就放在這里吧~比如監(jiān)聽DOM事件型型。

  5. beforeUpdate:$vm.data更新之后段审,虛擬DOM重新渲染 和打補(bǔ)丁之前被調(diào)用。
    你可以在這個(gè)鉤子中進(jìn)一步地修改$vm.data闹蒜,這不會(huì)觸發(fā)附加的重渲染過程寺枉。

  6. updated:虛擬DOM重新渲染 和打補(bǔ)丁之后被調(diào)用。
    當(dāng)這個(gè)鉤子被調(diào)用時(shí)嫂用,組件DOM的data已經(jīng)更新型凳,所以你現(xiàn)在可以執(zhí)行依賴于DOM的操作。但是不要在此時(shí)修改data嘱函,否則會(huì)繼續(xù)觸發(fā)beforeUpdate甘畅、updated這兩個(gè)生命周期,進(jìn)入死循環(huán)往弓!

  7. beforeDestroy:實(shí)例被銷毀之前調(diào)用疏唾。在這一步,實(shí)例仍然完全可用函似。
    實(shí)例要被銷毀了槐脏,趕在被銷毀之前搞點(diǎn)事情吧哈哈~

  8. destroyed:Vue實(shí)例銷毀后調(diào)用。此時(shí)撇寞,Vue實(shí)例指示的所有東西已經(jīng)解綁定顿天,所有的事件監(jiān)聽器都已經(jīng)被移除堂氯,所有的子實(shí)例也已經(jīng)被銷毀。
    這時(shí)候能做的事情已經(jīng)不多了牌废,只能加點(diǎn)兒提示toast之類的東西吧咽白。

:beforeMount、mounted鸟缕、beforeUpdate晶框、updated、beforeDestroy懂从、destroyed這幾個(gè)鉤子函數(shù)授段,在服務(wù)器端渲染期間不被調(diào)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末番甩,一起剝皮案震驚了整個(gè)濱河市侵贵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌对室,老刑警劉巖模燥,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咖祭,死亡現(xiàn)場(chǎng)離奇詭異掩宜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)么翰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門牺汤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人浩嫌,你說(shuō)我怎么就攤上這事檐迟。” “怎么了码耐?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵追迟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我骚腥,道長(zhǎng)敦间,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任束铭,我火速辦了婚禮廓块,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘契沫。我一直安慰自己带猴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布懈万。 她就那樣靜靜地躺著拴清,像睡著了一般靶病。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上口予,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天嫡秕,我揣著相機(jī)與錄音,去河邊找鬼苹威。 笑死昆咽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的牙甫。 我是一名探鬼主播掷酗,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窟哺!你這毒婦竟也來(lái)了泻轰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤且轨,失蹤者是張志新(化名)和其女友劉穎浮声,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旋奢,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泳挥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了至朗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屉符。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锹引,靈堂內(nèi)的尸體忽然破棺而出矗钟,到底是詐尸還是另有隱情,我是刑警寧澤嫌变,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布吨艇,位于F島的核電站,受9級(jí)特大地震影響腾啥,放射性物質(zhì)發(fā)生泄漏东涡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一碑宴、第九天 我趴在偏房一處隱蔽的房頂上張望软啼。 院中可真熱鬧,春花似錦延柠、人聲如沸祸挪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贿条。三九已至雹仿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間整以,已是汗流浹背胧辽。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留公黑,地道東北人邑商。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像凡蚜,于是被迫代替她去往敵國(guó)和親人断。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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