Vue的生命周期一起來看看

1. 生命周期(重要)

1.1 初步認識生命周期

  • 別名:生命周期回調函數、生命周期函數、生命周期鉤子。
  • 生命周期是什麼?Vue在關鍵時刻幫我們調用的一些特殊名稱的函數。
  • 生命周期函數的名字不可更改,但函數內部的具體內容由程序員自行編寫
  • 生命周期函數中的this指向也是vm 或 組件實例對象。

1.2 生命周期流程(8個)

1.初始化

​ 1.beforeCreate()

​ 2.created()

2.掛載(頁面渲染)

​ 1.beforeMount()

​ 2.mounted()

3.更新

​ 1.beforeUpdate()

​ 2.updated()

4.銷毀

​ 1.beforeDestory()

​ 2.destoryed()

1.3 生命周期詳細流程圖

在這裡插入圖片描述

1.4 常用的生命周期鉤子:

beforeCreate():可以配置全局事件總線,後面會講到先提一嘴

mounted(): 可以在此階段發送ajax請求, 啟動定時器、綁定自定義事件、訂閱消息等異步任務【初始化操作】

beforeDestroy(): 在此階段做收尾工作, 如: 清除定時器、解綁自定義事件、取消訂閱消息等【首尾工作】

1.4.1 關於銷毀

  • 銷毀後借助Vue開發者工具看不到任何信息
  • 銷毀後自定義事件會失效,但原生DOM事件依然有效
  • 一般不會在beforeDestroy操作數據,因為即使操作數據,也不會再觸發更新流程瞭。

1.4.2 關於父子組件的生命周期 

1.加載渲染的過程

父beforeCreate ==> 父created ==> 父beforeMount ==> 子beforeCreate ==> 子created ==> 子beforeMount ==> 子mounted ==> 父mounted

2.更新的過程

父beforeUpdate ==> 子beforeUpdate ==> 子updated ==> 父updated

3.銷毀過程

父beforeDestroy ==> 子beforeDestroy ==> 子destroyed ==> 父destroyed

1.5小案例

 <div id="root">
        <!-- 讓h3透明度產生過渡的效果 -->
        <h3 :style="{opacity:opacity}">歡迎學習Vue!</h3>
        <button @click="des">點擊我銷毀</button>
    </div>
    <script>
        Vue.config.productionTip = false
        let vm = new Vue({
            el: '#root',
            data: {
                opacity: 1
            },
            methods: {  
                des(){
                    // 觸發此函數必定調用,beforeDestroy(),destroyed()
                    this.$destroy()
                }
            },
            mounted() { //掛載
                /*
                		- 完成模板解析後並且將初始的真實的DOM元素掛載到頁面後,才執行的函數
                			隻會執行一次
                		- this指向Vue
                		- 開發中常用的方法,當我們想要讀取某個屬性但是讀不到,就可以
                		  將該屬性綁定到共同能夠訪問到的元素上,例如下面定時器的例子
                */
                this.timer = setInterval(() => {
                    this.opacity -= 0.01
                    if (this.opacity <= 0)
                        this.opacity = 1
                }, 10);
            },
            beforeDestroy() {
                console.log("beforeDestroy - 清除定時器");
                clearInterval(this.timer)
            },
            destroyed() {
                console.log("destroyed - 銷毀完畢")
            },
        })
    </script>

1.6 代碼舉例說明生命周期鉤子

  <div id="root">
        <h3>n的值為:{{n}}</h3>
        <button @click="add">點擊我n+1</button>
        <button @click="remove">點擊銷毀vm</button>
    </div>
    <script>
        Vue.config.productionTip = false
        let vm = new Vue({
            el: '#root',
            data: {
                n:1
            },
            methods: {
                add(){
                    this.n++
                },
                remove(){
                    this.$destroy()
                }
            },
            beforeCreate() {
                /* 
                    此時初始化生命周期,事件等,數據代理還未開始
                    vm無法訪問到data中的數據,methods中的方法
                */
                console.log("beforeCreate");
                //console.log(this.n);  //undefined
                // console.log(this.add()); // this.add is not a function
                // debugger
            },
            created() {
                /* 
                    已經完成瞭初始化的數據監視和數據代理
                    vm可以訪問到data中的數據和methods的方法
                */
                console.log("created");
                // console.log(this.n);  // 1
                // console.log(this.add());  // undefined
                // debugger
            },
            beforeMount() {
                /*
                    掛載之前,也就是圖中的判斷框裡執行的,此階段是Vue
                    在解析模板並且生成虛擬DOM存儲在內存當中,頁面還不能
                    看到解析後的樣子
                 */
                 console.log("beforeMount");
                //  debugger
            },
            mounted() {
                /* 
                    完成模板解析後並且將初始的真實的DOM元素掛載到頁面後,才執行的函數
                    一般在此:開啟一些定時器、發送網絡請求、訂閱消息、
                    綁定自定義事件等等初始化
                 */
                console.log("mounted");
                // debugger
            },
            beforeUpdate() {
                /* 
                    當數據發生更新後,此時數據已經更新完成,但是頁面
                    還是未更新的。
                    也就是面試所問的:頁面和尚未和數據保持同步的階段
                 */
                console.log("beforeUpdate");
            },
            updated() {
                /* 
                    在這之前會進行新舊虛擬DOM比較,最終完成頁面的更新
                    此階段就是頁面和數據保持同步
                 */
                 console.log("updated");
            },
            beforeDestroy() {
                /* 
                    當我們調用vm.$destroy時,才會執行下面兩個函數,
                    馬上要執行銷毀階段,一般在這個階段做一些收尾操作
                    比如:關掉定時器,取消訂閱,解綁自定義事件
                 */
                console.log("beforeDestroy");
            },
            destroyed() {
                /*
                    所有的指令,所有的自定義事件監聽器都沒瞭(隻留下原生的dom的事件)
                 */
                console.log("destroyed");
            },
        })
    </script>

總結

以上就是今天要講的內容,本文介紹瞭生命周期的相關知識,希望對大傢有所幫助!

推薦閱讀: