1. 程式人生 > >Vue 生命週期總結與思考實驗

Vue 生命週期總結與思考實驗

               生命週期函式就是 Vue 例項在某一個時間點自動執行的函式

先上圖,一步一步講解

建議邊看生命週期圖 邊看最下面的步驟一步一步的走,有不理解的地方看看總結。並且在事件中多實驗。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../vue.js"></script>
</head>
<body>
    <div id="app">hello Vue</div>
    <script>

        //  生命週期函式就是 Vue 例項在某一個時間點自動執行的函式
        //  總共有11個生命週期鉤子   圖上有8個生命週期鉤子

        
       /**
         * 1:首先它會去 初始化事件 和 生命週期相關的一些內容 最基礎的初始化完成
         *    在圖中就是 Init  Events & Lifecycle
         * 2:Vue 會自動的執行  beforeCreate 生命週期函式
         * 3:Vue 會繼續的處理一些外部的注入包括雙向的一些繫結相關的內容,
         *    當這部分的初始化也完成了之後,例項的一些初始化也都完成了。
         * 4:在這個節點上會自動的執行 created生命週期函式, Vue的初始化基本上已經結束
         * 5:然後會去判斷我這個例項上是否有  el屬性,如果有就會走Yes這條線。
         * 6:緊接著又會詢問 我這個例項上是否有  template  這個屬性
         * 6-1:如果沒有tempate 就會去走右側的分支,就是把el 本身及子元素當做模板來進行渲染
         * 6-2:如果有 template 屬性就會去走左邊的分支,把templaet 屬性值進行渲染。el就被否定了

         * 7:我們有了模板和資料之後並沒有直接去進行渲染,在渲染之前呢 會自動的執行  beforeMount 生命週期函式,也就是模板和資料相結合 ,即將掛載到頁面上去之前的時候回執行

         * 8:當掛載渲染到頁面之上後 執行  mounted 生命週期函式
         *
         * beforeDestroy 生命週期函式   即將被銷燬執行
         * destroyed 生命週期函式       被銷燬之後執行
         * 會在 這個Vue 例項  呼叫  $destroy() 方法會被執行這兩個方法
         *
         * beforeUpdate 生命週期函式   在資料發生改變還沒被渲染之前執行
         * updated 生命週期函式        在重新渲染之後 會被執行
         * 會在 Vue 的資料發生改變執行
         */

        var vm = new Vue({
            el:'#app',
            data:{
              message:"this is Vue life cycle"
            },
            // template:"<div>如果有template 屬性則執行template 進行渲染DOM</div>",
            template:"<div>{{message}}</div>",
            //  在建立Vue 例項之前執行的函式
            beforeCreate:function () {
                console.log('beforeCreate');
            },
            //  建立Vue  例項成功之後執行的函式
            created:function () {
                console.log('created');
            },
            //  如果有template 模板屬性 則將模板編譯渲染DOM
            //  如果沒有template  編譯el 的DOM 包含元素本身及內部的
            //  在掛載之前執行 也就是在真正渲染前執行
            beforeMount:function () {
                console.log(this.$el);
                console.log('beforeMount');
            },
            // 渲染完成執行的方法 
            mounted:function () {
                 console.log(this.$el);
                 console.log('mounted');
            },
            // 當資料發生變化時
            beforeUpdate:function () {
                console.log('beforeUpdate');
            },
            //  虛擬DOM 重新渲染 修改
            updated:function () {
                console.log('updated');
            },
            //  當執行這個Vue例項的  $destroy()  方法時執行
            beforeDestroy:function () {
                console.log(this.message);
            },
            //  當刪除了Vue例項時執行的方法
            destroyed:function () {
                console.log(this.message);
            }
        })
    </script>
</body>
</html>

補充這個當時遇到沒想明白,現在理解了的問題  分享:

//  我們的資料物件
var data = { a: 1};

//  該物件被加入到一個 Vue 例項中
var vm = new Vue({
    data: data
});

1:開啟頁面,到控制檯  Console 頁面 

data.a   
vm.a   
//    檢視雙方的值

2:現在改變  data.a 的值    該為  520    檢視vm.a  的值是否改變 。  是否是雙向繫結

data.a = 520
vm.a

結果發現確實是如我們所料 ,資料是雙向繫結的   是引用同一個記憶體地址
官方文件是這麼說的:

當這些資料改變時,檢視會進行重渲染。值得注意的是只有當例項被建立時 data 中存在的屬性才是響應式

但是雖然好像似懂非懂,但是不知道怎麼去測試。

3:在控制檯宣告的新變數  dd = 888  ,並且去繫結到  vm的 data資料中 

dd = 888
vm.b = dd
vm.b

4:這時候改變  vm.b = 999,去檢視下  dd  結果發現  dd的值還是 888  那麼對 b 的改動將不會觸發任何檢視的更新

5:這時候在去測試下   vm.a = 555  在去看   data.a    發現還是雙向繫結的

   

然後,在去看文件的這句話:     

如果你知道你會在晚些時候需要一個屬性,但是一開始它為空或不存在,那麼你僅需要設定一些初始值。比如:

data: {
  newTodoText: '',
  visitCount: 0,
  hideCompletedTodos: false,
  todos: [],
  error: null
}

明白了,只有當例項被建立時 data 中存在的屬性才是響應式的    到此結束!!