** Vue.js —— 漸進式前端框架 **
Vue.js作爲一個後起的前端框架,借鑑了Angular 、React等現代前端框架/庫的諸多特點,並且 取得了相當不錯的成績。
Vue.js的定位是一個__漸進式__框架,作者的說法是:
與其他框架的區別就是漸進式的想法,也就是__Progressive__——這個詞在英文中定義是漸進, 一步一步,不是說你必須一竿子把所有的東西都用上。
這或許是Vue.js受到越來越多關注的一個重要原因:你只需要具備基本的HTML/JavaScript/CSS 基礎,就可以快速上手,讓你用上這些現代Web開發中的先進技術來提高你的生產力:
響應式編程、聲明式渲染、組件化開發、虛擬DOM、跨平臺支持...
儘管Vue.js缺少令人眼前一亮的獨創性前端開發理念,但它集中實現了最近幾年前端領域技術 大躍進的諸多新理念、新技術。或許你認爲這些創新起源於Angular、React或者Knockout, 但Vue.js可以無縫引導大量jQuery時代的前端工程師進入新的時代,這也是一個相當值得稱讚的 巨大的成果。
與Angular和React出自巨型公司不同,Vue.js基本上是以作者(尤雨溪/Evan YOU)一己之力 完成。這或許部分解釋了__漸進式__這一思路的來源:軟件的第一使用者是其作者。
因此Vue.js更適合個人或小型團隊上手 —— 你沒有那麼多的精力,一開始就考慮構建工具鏈、 測試等諸多問題。你迫切需要的,是高效地生產出,你的用戶需要的產品或服務。
不過__漸進式__意味着Vue.js沒有侷限於小型應用的開發:你一樣可以使用ES2015、使用構建 工具鏈、使用集中狀態管理這些來開發大規模項目。只是,Vue.js允許你把這些東西的學習和應用, 在稍晚一些的時候引入,而不是必須先學習很多新東西才能上手。
** 1.Hello Vue.js 2 **
和其他現代前端框架一樣,Vue.js也是以__JavaScrip__作爲應用的入口,HTML只是提供一個渲染 的錨點 —— 這便利於Vue.js 2遷移到瀏覽器之外的其他平臺,比如移動設備,或者服務器。
創建一個Vue.js的Hello World示例相當簡單:
1、引入vue.js庫
<script src="lib/vue.js"></script>
這將暴露出一個全局類——Vue
,你可以用它來創建一個Vue實例。
2、創建Vue實例
Vue
是一個封裝了響應式開發、模板編譯等諸多特性的基礎類,你通過提供一些
配置項,來創建一個實例:
var vm = new Vue({...});
一個常見的配置項是template
,以類似HTML的語法來編制視圖的結構:
var vm = new Vue({
template: '<h1>Hello,Vue.js 2</h1>'
})
3、渲染Vue實例
要將Vue實例渲染到HTML頁面中,採用Vue實例的$mount()
方法,這個方法
的名稱,意味着渲染實際上是將Vue實例生成的(虛擬)DOM子樹,掛接到頁面DOM中。
容易理解,$mount()
方法需要指定一個定位用的DOM節點———錨點:
vm.$mount(anchor_element);
Vue.js會將渲染出的DOM子樹,插入錨點元素之前(並最終刪除這個錨點元素)。
可以使用CSS選擇符
或者指定一個HTMLElement
來聲明錨點。例如,
下面的示例將Vue實例掛接到id
爲app
的DOM對象處:
vm.$mount('#app');
** 2.使用隱式渲染 **
在前面的示例中,我們使用Vue實例的$mount()
方法來顯式地啓動Vue實例
的渲染。
實際上,Vue.js也提供了一個實例化時的配置項el
,來允許我們隱式地啓動
Vue實例的渲染。el
用來聲明目標渲染錨點,例如:
Vue({
template: '<h1>Hello,Vue.js 2!</h1>',
el: '#app'
})
工作原理
如果Vue.js檢測到你指定了el
配置項,將在內部自動地執行渲染 —— 這時你
不再需要額外調用$mount()
方法了:
我們看到的大部分Vue.js示例代碼,通常都會採用這種隱式渲染的寫法。不過我認爲
在開始學習時,使用__儀式感__更強的$mount()
方法,會讓你更多一點理解Vue.js
的設計思想。
** 3.使用HTML模板 **
在創建Vue實例時,如果聲明瞭el
配置項,那麼你也可以省略template
選項。這時候,Vue.js將提取錨點元素的HTML內容,做爲模板。
我們可以使用單一的el
配置項來創建Vue實例:
var vm = new Vue({el:'#app'});
在Vue.js中,這種模板被稱爲HTML模板,而使用template
配置項
書寫的模板,被稱爲字符串模板。
工作原理
當Vue.js發現你提供的選項中沒有template
屬性時,將提取el
屬性所
指定的DOM節點的outerHTML
內容作爲模板內容。這類似於:
var vm = new Vue({
el:'#app',
template: document.querySelector('#app').outerHTML
})
Vue.js支持使用HML模板,可能一方面源於早期AugularJS的影響,另一方面 可能在於,在HTML文件中書寫模板,還是比在JavaScript中寫字符串來的自然。
** 4.模型聲明與綁定 **
模板的存在的唯一目的,是爲了和數據綁定。
Vue.js在標準HTML語法基礎上,增加了一些擴展的語法來聲明數據的綁定。
數據綁定語法
在Vue.js的模板中,最常見的一種數據綁定語法,是使用模板引擎Mustache
的插值寫法:{{}}
。例如,下面的模板綁定了實例上下文中的name
變量:
<h1>{{name}}</h1>
當Vue.js渲染此模板時,將使用實例__數據上下文__中的name
變量值,來計算最終的
渲染結果。
數據模型聲明
在創建Vue實例時,使用data
配置項來聲明Vue實例的數據模型。
例如,下面的示例創建了一個具有初始模型{name:'Elthon John'}
的Vue實例:
var vm = new Vue({
template:'<h1>{{name}}</h1>',
data:{
name:'Elton John'
},
el:'#app'
})
Vue.js根據data
配置項聲明的初始模型構造__數據上下文__,進而和template
配置項
所聲明的模板執行綁定,因此,上面示例的最終渲染結果是:<h1>Elton John</h1>
。
** 5.模板的數據上下文 **
由於通常使用data
配置項來聲明Vue實例的數據模型,這容易讓我們誤以爲
只有在data
對象上聲明的數據纔可以與模板綁定。
當然不是這樣,模板的數據上下文 = Vue實例對象。
當Vue.js創建一個Vue實例時,它會將data
配置項的每個根屬性,(經過若干處理後)
添加爲實例的根屬性。
因此,實際上我們可以在模板中綁定實例的任意屬性。例如:下面的模板可以輸出
$mount()
方法的源代碼:
<pre>{{$mount}}</pre>
既然如此,我們爲什麼需要使用data
配置項來聲明數據模型,而不是直接
在實例上設置數據模型呢?例如,下面的代碼有什麼問題呢?
var vm = new Vue({
template:'<h1>{{name}}</h1>',
})
vm.name = 'WHOAMI';
vm.$mount('#app');
這是vue.js 2的一個核心特性 ———— 響應式計算。
** 6.響應式計算機制 **
響應式計算是一種面向變化傳播的編程範式,響應式計算模型主要包括 兩個部分:數據源和(依賴於數據源的)計算過程。當數據源發生變化時, 將自動執行計算過程(比如視圖的渲染過程):
雖然響應式計算本質上是一種通用的編程範式,但這種模型最初就是爲了簡化交互 式用戶界面的創建和實時系統動畫的繪製而提出來的一種方法,它使得我們只需要修改 數據源就可以自動更新用戶界面。
Vue.js內部實現了響應式計算框架,我們在創建Vue實例時,在data
配置項中聲明的數據,
會被自動轉換爲__響應式__數據源,當我們修改這部分數據時,依賴於這部分數據的
計算過程 —— 例如界面渲染過程 —— 將自動被執行,因此用戶界面也自動更新。
例如,對於下面的Vue實例:
new Vue({
template:'<h1>{{counter}}</h1>',
data: { counter: 0}
})
Vue.js將自動建立如下的響應式計算模型:
你看到,渲染計算依賴於Vue實例的counter
,因此,當counter
變化時,
我們將自動得到刷新的DOM視圖。
** 7.交互行爲聲明 **
視圖的作用是雙向的,除了向用戶展示信息,另一方面的用途在於採集用戶的輸入。
和數據綁定類似,Vue.js通過擴展模板的HTML語法,來聲明對用戶交互事件
的監聽。例如,下面的模板向Vue.js框架聲明瞭對button
元素的click
事件的監聽:
<button v-on:click="counter=0">RESET</button>
容易注意到button
元素的特殊屬性:v-on:click
。在Vue.js中,這種以
*v-*爲前綴的特殊的HTML屬性,被稱爲__指令__,通常用來增強或改變所在
HTML元素的行爲。例如,v-on
指令的作用,就是爲宿主元素(在這裏是button
)
聲明事件監聽:
類似於Vue.js中的其他指令,v-on
指令包括以下幾個部分:
- 指令名稱 ——
v-
開始、:
或=
之前的部分稱爲指令名稱。在上圖中,指令 名稱是v-on
。 - 指令參數 ——
:
之後的部分稱爲指令的參數。在上圖中,指令參數是:click
。 不是所有的Vue.js的指令都 需要參數,但是對於v-on
指令而言,使用參數可以 避免爲不同的事件實現不同的指令,例如,我們可以同樣方式聲明對hover
事件的 監聽:v-on:hover="..."
。 - 指令的值 ——
=
之後的字符串稱爲指令的值。在上圖中,指令的值是:counter=0
。 不同的指令,對指令值有不同的解釋。對於v-on
指令,它的值表示當事件發生時 應當執行的表達式。
指令值的執行上下文
模板的數據上下文是所屬的Vue實例對象。容易理解,v-on
指令的值表達式執行
的上下文也是所屬的Vue實例對象,因此,在下面的示例中,當點擊按鈕後,Vue實例
的counter
屬性將復位爲0
:
new Vue({
template:'<button v-on:click="counter=0">RESET</button>',
data: { counter:123}
})
簡化寫法
爲了避免大量書寫v-on:
前綴,Vue.js允許我們使用@
來簡化事件綁定的聲明語法。
例如,下面的兩種聲明是完全等效的:
<button v-on:click="test">TEST</button>
<button @click="test">TEST</button>
** 8.實例方法聲明 **
如果需要在點擊鼠標時,執行一個複雜的操作,那麼採用單一的表達式
作爲v-on
指令值就不夠了 —— 我們需要將複雜的操作封裝爲Vue實例的
一個方法,然後將v-on
指令的值設置爲這個方法。
使用methods
配置項來聲明Vue實例的方法。當Vue.js創建一個Vue實例時,
會將methods
配置項中聲明的方法,掛接到Vue實例對象上:
實例方法可以直接通過實例對象調用,例如,對於上圖中的vm
實例:
vm.handler(); //正確
實例方法另一個常見的用途,是將方法名聲明爲v-on
指令的值,當事件
觸發時將調用該實例對象上該名稱的方法。例如,下面的代碼爲Vue實例聲明
了reset
方法,並將其名稱作爲模板中button
元素的v-on
指令的值:
new Vue({
template: '<button v-on:click="reset">{{counter}}</button>',
data: { counter: 0},
methods: {
reset: function(){ this.counter = 0; }
}
})
方法函數體內的this對象
需要指出,在methods
配置對象中聲明的方法,其函數實現體內,this
總是
指向所在的Vue實例。所以,可以在這些函數體內,直接訪問通過data
配置項聲明
的數據,比如this.counter
。
** 9.生命週期鉤子 **
每個 Vue 實例在被創建之前都要經過一系列的初始化過程。在這個過程中,實例也會 調用一些生命週期鉤子(Lifecycle Hook) ,這就給我們提供了執行自定義邏輯 的機會。
初始化鉤子
初始化鉤子包括beforeCreate
和created
。這兩個鉤子允許我們在實例被渲染
到DOM之前執行一些初始化操作。由於DOM還未就緒,在初始化鉤子裏,不能訪問DOM
對象,實例的$el
屬性 —— 宿主DOM對象 —— 也沒有創建:
_beforeCreate_是最早被調用的鉤子,這時Vue.js還沒有構造響應式數據源,也沒 有初始化實例的事件。
在_created_鉤子裏,我們可以訪問響應式數據、監聽實例事件。不過還沒有將虛擬 DOM渲染到文檔DOM樹。
DOM掛載鉤子
掛載鉤子包括beforeMount
和mounted
,是最常使用的鉤子。這兩個鉤子允許我們
在*首次渲染**前後立即訪問Vue實例。因此,如果我們需要在首次渲染前後訪問或修改
DOM對象(例如,通過實例的$el
屬性訪問宿主元素),就應該使用這兩個鉤子:
_beforeMount_鉤子在模板編譯完成後、首次渲染前執行。
在_mounted_鉤子內可以自由地訪問組件渲染後的DOM對象(this.$el
)。這個鉤子
經常被用於修改DOM、集成第三方庫等操作。
更新鉤子
更新鉤子包括beforeUpdate
和updated
。每當實例需要重新渲染(例如模型發生變化等),
框架就會調用這兩個鉤子:
_beforeUpdate_鉤子在模型數據變化之後、渲染週期開始之前執行。在這個鉤子裏我們可以 在界面渲染前獲取實例屬性的最新值。
_updated_鉤子在重新渲染完成後被調用。
DOM卸載鉤子
DOM卸載鉤子包括beforeDestroy
和destroyed
,當實例被從DOM樹移除時執行。
這兩個鉤子允許我們在實例銷燬前後執行一些清理或統計分析的工作:
_beforeDestroy_鉤子在實例被銷燬(利用,通過調用實例的$destroy()
方法)之前被調用。
在這個鉤子裏可以清理對響應式數據的監聽。
__destroyed__鉤子在實例被銷燬之後被調用,此時實例已經不剩什麼東西了:-( 也可以 在這個鉤子裏執行一些最後時刻的清理工作,或者向遠程服務器通知實例被銷燬的消息。
大量相關的示例、練習和更多內容在這裏:
http://xc.hubwiz.com/course/592ee9b2b343f27b0ae1ba99
vuex 2 http://xc.hubwiz.com/course/597d463fff52d0da7e3e397a
vuerouter 2 http://xc.hubwiz.com/course/5983d3aeff52d0da7e3e3d50