1. 程式人生 > >Vue.js2.0核心思想

Vue.js2.0核心思想

spa src key 隊列 推送 loader pla 設計師 not

數據驅動:

Vue.js數據觀測原理在技術實現上,利用的是ES5Object.defineProperty和存儲器屬性: getter和setter(所以只兼容IE9及以上版本),可稱為基於依賴收集的觀測機制。核心是VM,即ViewModel,保證數據和視圖的一致性

watcher:每一個指令都會有一個對應的用來觀測數據的對象,叫做watcher,比如v-text="msg", {{ msg }},即為兩個watcher,watcher對象中包含了待渲染的關聯DOM元素。

技術分享
1 <div id="app">
2   {{ message }}
3 </div>
4 var app = new Vue({
5   el: ‘#app‘,
6   data: {
7     message: ‘Hello Vue!‘
8   }
9 })
技術分享

基於依賴收集的觀測機制原理:

1 將原生的數據改造成 “可觀察對象”,通常為,調用defineProperty改變data對象中數據為存儲器屬性。一個可觀察對象可以被取值getter,也可以被賦值setter。
2 在解析模板,也就是在watcher的求值過程中,每一個被取值的可觀察對象都會將當前的watcher註冊為自己的一個訂閱者,並成為當前watcher的一個依賴。
3 當一個被依賴的可觀察對象被賦值時,它會通知notify所有訂閱自己的watcher重新求值,並觸發相應的更新,即watcher對象中關聯的DOM改變渲染。 

依賴收集的優點在於可以精確、主動地追蹤數據的變化,不需要手動觸發或對作用域中所有watcher都求值(angular臟檢查實現方式的缺點)。特殊的是,對於數組,需要通過包裹數組的可變方法(比如push)來監聽數組的變化。在添加/刪除屬性,或是修改數組特定位置元素時,也需要調用特定的函數,如obj.$add(key, value)才能觸發更新。這是受ES5的語言特性所限。

組件系統:

應用類UI可以看作全部是由組件樹構成的。

註冊一個組件:

技術分享
 1 Vue.component(‘my-component‘, {
 2     // 模板
 3     template: ‘<div>{{msg}} {{privateMsg}}</div>‘,
 4     // 接受參數
 5     props: {
 6         msg: String    
 7     },
 8     // 私有數據,需要在函數中返回以避免多個實例共享一個對象
 9     data: function () {
10         return {
11             privateMsg: ‘component!‘
12         }
13     }
14 })
15 <my-component msg="hello"></my-component> 
技術分享

組件的核心選項

1 模板(template):模板聲明了數據和最終展現給用戶的DOM之間的映射關系。
2 初始數據(data):一個組件的初始數據狀態。對於可復用的組件來說,這通常是私有的狀態。
3 接受的外部參數(props):組件之間通過參數來進行數據的傳遞和共享。
4 方法(methods):對數據的改動操作一般都在組件的方法內進行。
5 生命周期鉤子函數(lifecycle hooks):一個組件會觸發多個生命周期鉤子函數,最新2.0版本對於生命周期函數名稱改動很大。
6 私有資源(assets):Vue.js當中將用戶自定義的指令、過濾器、組件等統稱為資源。一個組件可以聲明自己的私有資源。私有資源只有該組件和它的子組件可以調用。

Webpack是一個開源的前端模塊構建工具,它提供了強大的loader API來定義對不同文件格式的預處理邏輯,這是.vue後綴單文件組件形式的基礎。所以在此基礎上,尤大開發的vue-loader允許將模板、樣式、邏輯三要素整合在同一個文件中,以.vue文件後綴形成單文件組件格式,方便項目架構和開發引用。

其他特性:

1 異步批量DOM更新:當大量數據變動時,所有受到影響的watcher會被推送到一個隊列中,並且每個watcher只會推進隊列一次。這個隊列會在進程的下一個 tick異步執行。這個機制可以避免同一個數據多次變動產生的多余DOM操作,也可以保證所有的DOM寫操作在一起執行,避免DOM讀寫切換可能導致的layout。
2 動畫系統:Vue.js提供了簡單卻強大的動畫系統,當一個元素的可見性變化時,用戶不僅可以很簡單地定義對應的CSS Transition或Animation效果,還可以利用豐富的JavaScript鉤子函數進行更底層的動畫處理。
3 可擴展性:除了自定義指令、過濾器和組件,Vue.js還提供了靈活的mixin機制,讓用戶可以在多個組件中復用共同的特性。

總結:

Vuejs學習曲線非常平緩,主要是文檔實在太優秀了,旁證了設計師出身的程序員有多可怕。其輕量、高性能的特點,對於移動場景也有很好的契合。更重要的是,設計完備的組件系統和配套的構建工具、插件,使得Vue.js在保留了其簡潔API的同時,也已經完全有能力擔當起復雜的大型應用的開發。

本人構建Vue WebApp技術棧:vuejs + vuex + vue-router + vue-resource + vux(UI庫) + webpack

以上

Vue.js2.0核心思想