iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0

前言

本章節接續前面所講的生命週期
這次會提及掛載,更新,銷毀等流程
以及各自所能使用的Hook

掛載

目前在生命週期已完成了虛擬DOM的創建
但DOM並未在頁面呈現, 只有存在內存之中
那本階段即是將虛擬DOM掛載到頁面的操作

https://ithelp.ithome.com.tw/upload/images/20230918/20160193eJoqtiqgq2.png

beforeMount

beforeMount(){
    console.log(this);
    debugger;
},

此階段的Hook是針對虛擬 DOM創建完掛載前的操作
https://ithelp.ithome.com.tw/upload/images/20230918/20160193IzHZ2oH2Tf.png

可以看到 _isMounted還是呈現 false的狀態
且畫面還是差值語法未編譯的結果
→ 此階段對 DOM操作是不會奏效的, 因為虛擬DOM的建立已經結束
下一步驟會將虛擬 DOM取代真實 DOM
在 beforeMount()裡對 DOM的操作都是針對真實 DOM的操作
有效果, 但馬上就被覆蓋掉了

Create vm.$el and replace el with it

在beforeMount之後的下一階段
即是將虛擬DOM掛載到真實DOM上面

mounted

mounted(){
    console.log(this);
    debugger;
}

https://ithelp.ithome.com.tw/upload/images/20230918/20160193e1V8X42VfE.png
可以發現頁面呈現的已經是編譯完成的 DOM說明掛載已經完成
vm中 → _isMounted的狀態也已經是 true
在此階段中, 對 DOM的操作是有效的
通常會在此階段配置事件
ex : 定時器, 網路請求, 訂閱消息, 自定義事件…
以上事件共通來說都是偏向初始化操作
是對 DOM初始建立後執行的步驟

更新

當 data更新的時候, Vue會生成新的虛擬 DOM出來
隨後再跟舊的虛擬 DOM做比較 (對應到 v-if (key) 的原理)
最後再掛在到頁面上, 形成 DOM的更新
https://ithelp.ithome.com.tw/upload/images/20230918/201601938ZBXKyhE3N.png

beforeUpdate
觸發時機點在於 data數據的更新
其擁有的狀態是:新的 data, 舊的 DOM

<body>
    <div id="root">
        <h1>{{person.name}}</h1>
        <button @click="changeName" >改名</button>
    </div>
    <script>
        new Vue({
            el : "#root",
            data :{
                person : {
                    name : 'Adam',
                },
            },
            methods : {
                changeName(){
                    console.log("change");
                    return this.person.name = 'Yuchen';
                }
            },
            beforeUpdate(){
                console.log(this._data);
                console.log(this.$el);
                debugger;
            },
        })
    </script>
</body>

https://ithelp.ithome.com.tw/upload/images/20230918/20160193I0Nu2MaEtg.png
可以觀察到 _data數據已更新完畢
但畫面上還未進行掛載, $el也還是舊的 DOM
這意味著說新的虛擬 DOM還未更新到真實 DOM上

updated
此 Hook觸發在圖片中綠色匡之後
即完成 DOM的替換
此方法即是更新後的最後結尾

https://ithelp.ithome.com.tw/upload/images/20230918/20160193LxZfTG76kd.png

由此可見,畫面也進行了更新,$el 也是最新的狀態了

銷毀

此流程是生命週期的最後一個流程
條件會是當呼叫了 vm.$destroy()
那 vm將會進入銷毀流程, 生命週期也進入了尾聲

https://ithelp.ithome.com.tw/upload/images/20230918/20160193BBr1MFSzzY.png

$destroy()
以下是 Vue對 $destroy() 的說明
主要會銷毀掉 vm實例, 並且會斷開和其他實例的連接
其他實例的連結所提及的是 → 其他組件
另外會解綁 vm的全部指令以及事件監聽器

事件監聽器指的是 → 自定義事件, 一般 button等等的點擊功能
在渲染到真實 DOM的時候, 就不會被撤銷了
vm的銷毀是不會影響到真實 DOM的

簡單來說, destroy後跟 Vue一點關係都沒有了
https://ithelp.ithome.com.tw/upload/images/20230918/201601939E7VVdPaSa.png

然而在進行銷毀流程的過程中
會進行兩個hook → beforeDestroy(), destroyed()

<div id="root">
    <h1>{{person.name}}</h1>
    <button @click="del()" >銷毀</button>
</div>
<script>
    new Vue({
        el : "#root",
        data :{
            person : {
                name : 'Adam',
            },
        },
        methods : {
            del() {
                this.$destroy();
            }
        },
        beforeDestroy(){
            console.log("beforeDestroyed");
        },
        destroyed(){
            console.log("destroyed");
        }
    })
</script>

beforeDestroy
此 Hook是在銷毀流程進行前
所有的 data, methods, 指令都還能做使用
主要是做收尾流程
關閉定時器, 取消訂閱消息, 解綁自定義事件等等

注意!!

雖然可以調用, 但已經不會再做更新流程了
依照生命週期的流程走向 data的數據更新也不會走到更新流程
可以調用, 但 Vue不會再更新數據了

destroyed
此 Hook為完整結束生命週期開始調用
做一個生命週期的總節
但此處的 vm已經被銷毀
所以此 Hook也不太常用


總結

  • 鉤子
    在生命週期的各個階段中, 每個階段都有其可執行的函數式
    此階段的函數式稱為 Hook(鉤子)

  • 初始化操作
    會在 mounted進行:
    ajax操作, 定時器, 訂閱服務, 綁定自定義操作

  • 收尾操作
    會在 beforeDestroy進行:
    消除定時器, 訂閱服務, 綁定自定義操作

  • 銷毀Vue實例

  1. 借助開發者工具將看不到任何訊息
  2. 銷毀後自定義事件機失效, 但原生 DOM事件還會存在
  3. 一般不會在 beforeDestroy做數據操作, 因為操作也不會做數更新流程

上一篇
2023鐵人賽_Vue2基本使用規則(Day17)-生命週期(上)
下一篇
2023鐵人賽_Vue2基本使用規則(Day19)-非單文件組件
系列文
Vue2 初步認識以及基本使用規則 && 了解 Vue2 的基本原理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言