iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
Modern Web

前端暴龍機,Vue2.x 進化 Vue3系列 第 4

[前端暴龍機,Vue2.x 進化 Vue3 ] Day4. Vue的生命週期

開心,終於正式進入 Vue 的介紹了~
在了解 Vue 的寫法前,有個重要的觀念必需去了解,那就是 Vue的生命週期
其實我覺得,不管是不是 vue 還是其他的前端框架,生命週期應該都可以算是框架的整個核心,若是不去了解,也是很難實作的,那麼開始吧~

Vue 的生命週期介紹

首先,先來看看官方提供的生命週期圖
https://ithelp.ithome.com.tw/upload/images/20210812/20120722VYhX4BlTA8.png
圖片來源 Vue官方文件

生命週期可以讓我們更好理解哪些問題可以在哪一個時機去進行處理,而 Vue 提供了這些時機呼叫的方式,稱之為 hook,接著把上面各個週期先整理出來,以下:

  • beforeCreate :
    實例初始化立即叫用,但是還為創建實例,任何的 Vue實體 都還未配置(像是 datamethods ...都還無法使用)

  • created :
    Vue 的實例已經完成創建,這時 Vue實體中的配置除了 $el 外已全部配置(datamethods ...已初始化,可以取得其資料),$el 要在掛載模板後才會配置

  • beforeMount :
    在 Vue 實體中的定義掛載到目標元素之前,$el 會是還未被 Vue 實體中定義渲染的初始設定模板

  • mounted :
    Vue 實體中的定義已經成功掛載到目標元素,$el 已透過 Vue 實體中的定義渲染成真正的頁面(像是 v-modelv-bind{{ }} .... 等都已經成功渲染或是綁定完成)

  • beforeUpdate :
    在資料更新前(像是變更 data 裡面變數的值之前)

  • updated :
    我們變動的值已經變更上去並更新畫面了

  • beforeDestroy :
    在 Vue實體被銷毀之前,功能都還完整存在

  • destroyed :
    此時 Vue實體已經被銷毀,雖然畫面還是會存在,不過已解除綁定,任何操作也無法更新畫面了
    (有點類似 Vue 歸 Vue,DOM 歸 DOM 的概念,所以儘管 Vue 的值再怎麼去變更,也只是 Vue 裡面在做的事情,畫面已經不會去管,無雙向綁定的效果了)

跟著實例一起看生命週期

看著文字,有時候真的不好想像畫面,如果你跟我一樣~ 是需要搭配著例子比較好懂類型的人 XD
下面用最簡單的例子來看看 各個生命週期的時機吧~

在網頁啟動完畢時,已瞬間來到 mounted

https://ithelp.ithome.com.tw/upload/images/20210812/20120722YtI1FJDydI.jpg
看到了嗎? 只要網頁一打開,就已經經過了生命週期的四個階段,代表 vue 的實體已經被建立好,並且綁訂到指定的實體 DOM 上面了,也就代表我們只要更改 data 裡變數的值,畫面就會跟著被更新

更新內容的那瞬間

接著我們可以透過實例畫面上的輸入框來更新 hello 的字樣,這裡示範的做法是用 v-model 綁定輸入內容,再將輸入的內容指定給 hello 字樣的插值變數,更新完畢後也已經跑完 beforeUpdateupdated 兩個生命週期了。
https://ithelp.ithome.com.tw/upload/images/20210812/20120722OFz864IC4t.jpg
圖中之所以會有那麼多次 beforeUpdateupdated 是因為在輸入框使用了 v-model ,因此每當輸入一個字,v-model 所綁定的變數都需要更新,進而觸發 beforeUpdateupdated
(v-model 之後會提到,這邊先偷偷用一下XD)

燒毀 ~ 斷開 vue 的連結,斷開鎖鏈

最後我們來看 beforeDestroydestroyed 這兩個週期,這邊我們先寫了一個按鈕來呼叫 destroyed,所以畫面中的 Destroy instance 按鈕一點擊下去,我們再怎麼變更綁定的值,畫面也不會更新了
https://ithelp.ithome.com.tw/upload/images/20210812/20120722JzzboHFi1T.jpg
從圖中右邊的 console 來看,destroyed 被觸發後 vue 就與實體 DOM 的連結被切斷了,雖然綁定的變數值已經被改成 Orz,但是畫面已經不會更新了。

另一點可以觀察的是,destroyed 後我們變更輸入框的內容,一樣也不再觸發 beforeUpdateupdated
附上實例的程式碼 : Codepen 生命週期範例


參考資料

iT邦幫忙 [ Vue.js ] 生命週期 lifecycle ,ShawnL
iT邦幫忙 Vue.js Core 30天屠龍記(第4天): Vue 實體的生命週期 ,Peter Chen


上一篇
[前端暴龍機,Vue2.x 進化 Vue3 ] Day3.在認識vue之前(三)
下一篇
[前端暴龍機,Vue2.x 進化 Vue3 ] Day5. Vue的起手開發
系列文
前端暴龍機,Vue2.x 進化 Vue330
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言