1. 程式人生 > >Vue2 第四天學習(Vue的生命周期)

Vue2 第四天學習(Vue的生命周期)

函數 gen 為什麽 urn pad 指向 ret htm 編譯

閱讀目錄

  • 1.理解VUE---混合
  • 2.Vue實例化選項
  • 3.Vue實例化的生命周期
回到頂部

1.理解VUE---混合

在了解Vue生命周期之前,我們先來學習Vue中的混合吧;

為什麽需要使用混合?
假如當我們開發時候,a.js和b.js都有公用的代碼的時候,我們可以把他們抽取出來,在a.js或b.js的需要的時候可以引用進來即可,這可以簡單的理解為混合。
混合對象可以包含任意組件選項,所有混合對象的選項將被混入該組件本身的選項。什麽意思呢?可以簡單的理解為該組件引入該混合對象的時候,該組件擁有該混合對象的所有屬性和方法。
看下如下demo代碼:

<!DOCTYPE html>
<html>
  <head>
    <title>演示Vue</title>
  </head>
  <body>
    <div id=‘app‘> 
    </div> 
  </body>
  <script src="./vue.js"></script>
  <script type="text/javascript">
    // 定義一個混合對象
    var myMixin = {
      template: 
<div>hello world</div>, methods: { hello: function() { console.log(hello); }, say: function() { console.log(I am longen); } } }; // 定義一個組件 使用上面的混合對象 var Component = Vue.extend({ mixins: [myMixin], methods: { list:
function() { console.log(lists); }, say: function() { console.log(I am kongzhi); } } }); // 實例化 var Vm = new Component({ el: #app }); Vm.hello(); // 打印出 hello Vm.list(); // 打印 lists Vm.say(); // 打印 I am kongzhi </script> </html>

上面代碼可以看到 當實例化對象本身和混合對象有相同的函數名的時候,會先調用自身的函數,如果自身的函數不存在,才會
尋找混合對象的函數名。

回到頂部

2.Vue實例化選項

在實例化vue時,需要傳入一個選項對象,它可以包含數據(data), 模板(template), 掛載元素(el), 方法(methods), 生命周期構造選項等。
2-1 data
Vue實例的數據都保存在data對象中,Vue將會遞歸將data的屬性轉換為getter/setter, 讓data數據能夠響應變化。
比如如下代碼:

var data = {
  a: 1
};
var vm = new Vue({
 data: data
});
console.log(vm);
console.log(vm.a === data.a); // true
console.log(vm.$data === data); // true

2-2 computed
該屬性可以理解為計算屬性,getter 和 setter的this上下文自動的綁定vue的實例。如下代碼:

var vm = new Vue({
  el: ‘#app‘,
  data: {
    message: ‘Hello‘
  },
  computed: {
    reversedMessage: function() {
      return this.message.split(‘‘).reverse().join(‘‘)
    }
  }
});
console.log(vm.reversedMessage);  // olleH  

切記:調用屬性 只能 vm.reversedMessage, 因為不是調用方法,後面不能加小括號;且後面的function不要使用箭頭函數代替,因為this一般都指向vue的實例。

2-3 methods
從字面量理解可以認為 是vue的所有方法寫在該對象中,可以直接通過vue實例訪問這些方法。方法中this指向vue的實例。如下代碼:

var vm = new Vue({
  el: ‘#app‘,
  data: {
    message: ‘Hello‘
  },
  methods: {
    reversedMessage: function () {
      return this.message.split(‘‘).reverse().join(‘‘)
    }
  }
});
console.log(vm.reversedMessage()) // -> ‘olleH‘ 

從上面的 methods 和 computed看 他們兩者都可以做同樣的事情,那麽他們的區別是?computed是計算屬性的,methods是計算方法的,最主要的區別是 computed計算屬性可以對
屬性進行緩存的,計算屬性只有當該屬性發生變化的時候才會重新計算值,只要值沒有改變,它是不會重新渲染的,但是methods方法不同,每次調用該方法的時候,都會重新執行的。

2-4 watch
可以理解為 觀察某個值發生變化的回調函數。值也可以是方法名,或者包含選項的對象,Vue實例將會在實例化時調用$watch(),遍歷watch對象的每一個屬性。
如下代碼:

var vm = new Vue({
  data: {
    a: 11,
    b: 22,
    c: 33
  },
  watch: {
    // 監控a變量變化的時候,會自動執行該函數。
    a: function(newVal, oldVal) {
      console.log(newVal);  // 打印 12
      console.log(oldVal);  // 打印 11
    }
  }
});
vm.a = 12; // 改變a的值,會自動調用watch對象中的a函數,返回新值 和 舊值。
回到頂部

3.Vue實例化的生命周期

實例化生命周期 從開始創建,初始化數據,編譯模板,掛載Dom->渲染, 更新->重新渲染,銷毀等。

beforeCreate: function() {}  // 在實例初始化之後, 數據觀測 和 event/watcher 事件配置之前被調用。
created: function() {}       // 實例已經創建完成之後被調用。實例已完成如: 數據觀測,屬性和方法的計算,watch/event事件回調。
beforeMount: function() {}   // 在掛載開始之前被調用, 該函數在服務器端渲染期間不會被調用。
mounted: function() {}       // el被新創建的 vm.$el替換,並掛載到實例上去之後調用該函數,在該函數內可以獲取元素。
render: function() {}        // 頁面被渲染時會調用該函數。該函數在mounted之前會被調用。
beforeUpdate: function(){}   // 數據更新時調用,發生在虛擬Dom重新渲染之前。該函數在服務器端渲染期間不會被調用。
updated: function() {}       // 由於數據更改導致虛擬DOM重新被渲染會調用。在被渲染後調用該函數。可以或許新的dom元素。該函數在服務器端渲染期間不會被調用。
activated: function() {}     // keep-alive組件激活時調用 該函數在服務器端渲染期間不會被調用。
deactivated: function(){}    // keep-alive 組件停用時被調用。該函數在服務器端渲染期間不會被調用。
beforeDestroy: function(){}  // 實例銷毀之前被調用,實例仍然完全可用 該函數在服務器端渲染期間不會被調用。
destroyed: function() {}     // Vue 實例銷毀後調用,調用後,Vue實例所有東西都會被解綁定,所有的事件監聽器會被移除,所有的實例被銷毀。

下面看看代碼如下:

<!DOCTYPE html>
<html>
  <head>
    <title>演示Vue</title>
  </head>
  <body>
    <div id=‘app‘>
      <p> {{ number }} </p>
      <input type=‘text‘ v-model=‘number‘ />
    </div>
  </body>
  <script src="./vue.js"></script>
  <script type="text/javascript">
    var vm = new Vue({
      el: ‘#app‘,
      data: {
        number: 1
      },
      beforeCreate: function() {
        console.log(‘beforeCreate‘, this.number);
      },
      created: function() {
        console.log(‘created‘, this.number);
      },
      beforeMount: function() {
        console.log(‘beforeMount:‘, this.number)
      },
      mouted: function() {
        console.log(‘mouted‘, this.number);
      },
      beforeUpdate: function() {
        console.log(‘beforeUpdate‘, this.number);
      },
      updated: function() {
        console.log(‘updated‘, this.number);
      },
      beforeDestroy: function() {
        console.log(‘銷毀前.....‘);
      },
      destroyed: function() {
        console.log(‘已銷毀.....‘);
      }
    });
    Vue.nextTick(function () {
      // DOM 更新了
      console.log(1111);  // 打印出 1111
    })
  </script>
</html>

我們在瀏覽器控制臺看到,第一次頁面加載後,打印信息如下:

beforeCreate undefined
created 1
beforeMount: 1
1111

從上面可以看到,頁面第一次加載後,觸發了 beforeCreate,created,beforeMount等生命周期函數,當然 mouted 生命周期在加載完後dom操作也會被觸發的。
beforeCreate 在實例創建之前 是獲取不到值的,上面頁面加載完成後,可以看出值為undefined;
當我們在控制臺 console.log(‘mounted: ‘, document.getElementsByTagName(‘p‘)[0]) DOM 渲染在 mounted 中已經完成。
我們接著在input輸入框 在輸入一個1字,控制臺打印出如下信息:
beforeUpdate 11
updated 11

可以看到當內容被更新的時候 調用了 beforeUpdate 和 updated 等生命周期函數。
當我繼續在控制臺中 調用如下銷毀方法:vm.$destroy() 後,在控制臺會打印如下信息:
銷毀前.....
已銷毀.....
說明這時候會自動調用了 beforeDestroy 和 destroyed 等生命周期函數。為此整個生命周期過程就是這樣的。

Vue.nextTick([callback, context]): 在DOM更新循環結束之後執行的延遲回調函數,在修改數據之後立即使用這個方法,獲取更新後的DOM元素。

Vue.nextTick(function () {
  // DOM 更新了
  console.log(1111);  // 打印出 1111
})

Vue2 第四天學習(Vue的生命周期)