Vue.js 60分鐘輕松入門(mén)
Vue.js介紹
Vue.js是當(dāng)下很火的一個(gè)JavaScript MVVM庫(kù),它是以數(shù)據(jù)驅(qū)動(dòng)和組件化的思想構(gòu)建的。相比于Angular.js,Vue.js提供了更加簡(jiǎn)潔、更易于理解的API,使得我們能夠快速地上手并使用Vue.js。
如果你之前已經(jīng)習(xí)慣了用jQuery操作DOM,學(xué)習(xí)Vue.js時(shí)請(qǐng)先拋開(kāi)手動(dòng)操作DOM的思維,因?yàn)閂ue.js是數(shù)據(jù)驅(qū)動(dòng)的,你無(wú)需手動(dòng)操作DOM。它通過(guò)一些特殊的HTML語(yǔ)法,將DOM和數(shù)據(jù)綁定起來(lái)。一旦你創(chuàng)建了綁定,DOM將和數(shù)據(jù)保持同步,每當(dāng)變更了數(shù)據(jù),DOM也會(huì)相應(yīng)地更新。
當(dāng)然了,在使用Vue.js時(shí),你也可以結(jié)合其他庫(kù)一起使用,比如jQuery。
本文的Demo和源代碼已放到GitHub,如果您覺(jué)得本篇內(nèi)容不錯(cuò),請(qǐng)點(diǎn)個(gè)贊,或在GitHub上加個(gè)星星!
v-for Demo v-bind Demo Page Demo GitHub Source
MVVM模式
下圖不僅概括了MVVM模式(Model-View-ViewModel),還描述了在Vue.js中ViewModel是如何和View以及Model進(jìn)行交互的。

ViewModel是Vue.js的核心,它是一個(gè)Vue實(shí)例。Vue實(shí)例是作用于某一個(gè)HTML元素上的,這個(gè)元素可以是HTML的body元素,也可以是指定了id的某個(gè)元素。
當(dāng)創(chuàng)建了ViewModel后,雙向綁定是如何達(dá)成的呢?
首先,我們將上圖中的DOM Listeners和Data Bindings看作兩個(gè)工具,它們是實(shí)現(xiàn)雙向綁定的關(guān)鍵。
從View側(cè)看,ViewModel中的DOM Listeners工具會(huì)幫我們監(jiān)測(cè)頁(yè)面上DOM元素的變化,如果有變化,則更改Model中的數(shù)據(jù);
從Model側(cè)看,當(dāng)我們更新Model中的數(shù)據(jù)時(shí),Data Bindings工具會(huì)幫我們更新頁(yè)面中的DOM元素。
Hello World示例
了解一門(mén)語(yǔ)言,或者學(xué)習(xí)一門(mén)新技術(shù),編寫(xiě)Hello World示例是我們的必經(jīng)之路。
這段代碼在畫(huà)面上輸出"Hello World!"。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<!--這是我們的View-->
<div id="app">
{{ message }}
</div>
</body>
<script src="js/vue.js"></script>
<script>
// 這是我們的Model
var exampleData = {
message: 'Hello World!'
}
// 創(chuàng)建一個(gè) Vue 實(shí)例或 "ViewModel"
// 它連接 View 與 Model
new Vue({
el: '#app',
data: exampleData
})
</script>
</html>
使用Vue的過(guò)程就是定義MVVM各個(gè)組成部分的過(guò)程的過(guò)程。
1、定義View
2、定義Model
3、創(chuàng)建一個(gè)Vue實(shí)例或"ViewModel",它用于連接View和Model
在創(chuàng)建Vue實(shí)例時(shí),需要傳入一個(gè)選項(xiàng)對(duì)象,選項(xiàng)對(duì)象可以包含數(shù)據(jù)、掛載元素、方法、模生命周期鉤子等等。
在這個(gè)示例中,選項(xiàng)對(duì)象的el屬性指向View,el: '#app'表示該Vue實(shí)例將掛載到<div id="app">...</div>這個(gè)元素;data屬性指向Model,data: exampleData表示我們的Model是exampleData對(duì)象。
Vue.js有多種數(shù)據(jù)綁定的語(yǔ)法,最基礎(chǔ)的形式是文本插值,使用一對(duì)大括號(hào)語(yǔ)法,在運(yùn)行時(shí){{ message }}會(huì)被數(shù)據(jù)對(duì)象的message屬性替換,所以頁(yè)面上會(huì)輸出"Hello World!"。
Vue.js已經(jīng)更新到2.0版本了,但由于還不是正式版,本文的代碼都是1.0.25版本的。
雙向綁定示例
MVVM模式本身是實(shí)現(xiàn)了雙向綁定的,在Vue.js中可以使用v-model指令在表單元素上創(chuàng)建雙向數(shù)據(jù)綁定。
<!--這是我們的View-->
<div id="app">
<p>{{ message }}</p>
<input type="text" v-model="message"/>
</div>
將message綁定到文本框,當(dāng)更改文本框的值時(shí), <p>{{ message }}</p> 中的內(nèi)容也會(huì)被更新。

反過(guò)來(lái),如果改變message的值,文本框的值也會(huì)被更新,我們可以在Chrome控制臺(tái)進(jìn)行嘗試。

Vue實(shí)例的data屬性指向exampleData,它是一個(gè)引用類(lèi)型,改變了exampleData對(duì)象的屬性,同時(shí)也會(huì)影響Vue實(shí)例的data屬性。
Vue.js的常用指令
上面用到的v-model是Vue.js常用的一個(gè)指令,那么指令是什么呢?
Vue.js的指令是以v-開(kāi)頭的,它們作用于HTML元素,指令提供了一些特殊的特性,將指令綁定在元素上時(shí),指令會(huì)為綁定的目標(biāo)元素添加一些特殊的行為,我們可以將指令看作特殊的HTML特性(attribute)。
Vue.js提供了一些常用的內(nèi)置指令,接下來(lái)我們將介紹以下幾個(gè)內(nèi)置指令:
v-if指令
v-show指令
v-else指令
v-for指令
v-bind指令
v-on指令
Vue.js具有良好的擴(kuò)展性,我們也可以開(kāi)發(fā)一些自定義的指令,后面的文章會(huì)介紹自定義指令。
v-if指令
v-if是條件渲染指令,它根據(jù)表達(dá)式的真假來(lái)刪除和插入元素,它的基本語(yǔ)法如下:
v-if="expression"
expression是一個(gè)返回bool值的表達(dá)式,表達(dá)式可以是一個(gè)bool屬性,也可以是一個(gè)返回bool的運(yùn)算式。例如:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="app">
<h1>Hello, Vue.js!</h1>
<h1 v-if="yes">Yes!</h1>
<h1 v-if="no">No!</h1>
<h1 v-if="age >= 25">Age: {{ age }}</h1>
<h1 v-if="name.indexOf('jack') >= 0">Name: {{ name }}</h1>
</div>
</body>
<script src="js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
yes: true,
no: false,
age: 28,
name: 'keepfool'
}
})
</script>
</html>
注意:yes, no, age, name這4個(gè)變量都來(lái)源于Vue實(shí)例選項(xiàng)對(duì)象的data屬性。

這段代碼使用了4個(gè)表達(dá)式:
數(shù)據(jù)的yes屬性為true,所以"Yes!"會(huì)被輸出;
數(shù)據(jù)的no屬性為false,所以"No!"不會(huì)被輸出;
運(yùn)算式age >= 25返回true,所以"Age: 28"會(huì)被輸出;
運(yùn)算式name.indexOf('jack') >= 0返回false,所以"Name: keepfool"不會(huì)被輸出。
注意:v-if指令是根據(jù)條件表達(dá)式的值來(lái)執(zhí)行元素的插入或者刪除行為。
這一點(diǎn)可以從渲染的HTML源代碼看出來(lái),面上只渲染了3個(gè)<h1>元素,v-if值為false的<h1>元素沒(méi)有渲染到HTML。

為了再次驗(yàn)證這一點(diǎn),可以在Chrome控制臺(tái)更改age屬性,使得表達(dá)式age >= 25的值為false,可以看到<h1>Age: 28</h1>元素被刪除了。

age是定義在選項(xiàng)對(duì)象的data屬性中的,為什么Vue實(shí)例可以直接訪問(wèn)它呢?
這是因?yàn)槊總€(gè)Vue實(shí)例都會(huì)代理其選項(xiàng)對(duì)象里的data屬性。
v-show指令
v-show也是條件渲染指令,和v-if指令不同的是,使用v-show指令的元素始終會(huì)被渲染到HTML,它只是簡(jiǎn)單地為元素設(shè)置CSS的style屬性。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="app">
<h1>Hello, Vue.js!</h1>
<h1 v-show="yes">Yes!</h1>
<h1 v-show="no">No!</h1>
<h1 v-show="age >= 25">Age: {{ age }}</h1>
<h1 v-show="name.indexOf('jack') >= 0">Name: {{ name }}</h1>
</div>
</body>
<script src="js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
yes: true,
no: false,
age: 28,
name: 'keepfool'
}
})
</script>
</html>

在Chrome控制臺(tái)更改age屬性,使得表達(dá)式age >= 25的值為false,可以看到<h1>Age: 24</h1>元素被設(shè)置了style="display:none"樣式。

v-else指令
可以用v-else指令為v-if或v-show添加一個(gè)“else塊”。v-else元素必須立即跟在v-if或v-show元素的后面——否則它不能被識(shí)別。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="app">
<h1 v-if="age >= 25">Age: {{ age }}</h1>
<h1 v-else>Name: {{ name }}</h1>
<h1>---------------------分割線---------------------</h1>
<h1 v-show="name.indexOf('keep') >= 0">Name: {{ name }}</h1>
<h1 v-else>Sex: {{ sex }}</h1>
</div>
</body>
<script src="js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
age: 28,
name: 'keepfool',
sex: 'Male'
}
})
</script>
</html>
v-else元素是否渲染在HTML中,取決于前面使用的是v-if還是v-show指令。
這段代碼中v-if為true,后面的v-else不會(huì)渲染到HTML;v-show為tue,但是后面的v-else仍然渲染到HTML了。

v-for指令
v-for指令基于一個(gè)數(shù)組渲染一個(gè)列表,它和JavaScript的遍歷語(yǔ)法相似:
v-for="item in items"
items是一個(gè)數(shù)組,item是當(dāng)前被遍歷的數(shù)組元素。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="styles/demo.css" />
</head>
<body>
<div id="app">
<table>
<thead>
<tr>
<th>Name</th>
<th>Age</th>
<th>Sex</th>
</tr>
</thead>
<tbody>
<tr v-for="person in people">
<td>{{ person.name }}</td>
<td>{{ person.age }}</td>
<td>{{ person.sex }}</td>
</tr>
</tbody>
</table>
</div>
</body>
<script src="js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
people: [{
name: 'Jack',
age: 30,
sex: 'Male'
}, {
name: 'Bill',
age: 26,
sex: 'Male'
}, {
name: 'Tracy',
age: 22,
sex: 'Female'
}, {
name: 'Chris',
age: 36,
sex: 'Male'
}]
}
})
</script>
</html>
我們?cè)谶x項(xiàng)對(duì)象的data屬性中定義了一個(gè)people數(shù)組,然后在#app元素內(nèi)使用v-for遍歷people數(shù)組,輸出每個(gè)person對(duì)象的姓名、年齡和性別。

v-bind指令
v-bind指令可以在其名稱后面帶一個(gè)參數(shù),中間放一個(gè)冒號(hào)隔開(kāi),這個(gè)參數(shù)通常是HTML元素的特性(attribute),例如:v-bind:class
v-bind:argument="expression"
下面這段代碼構(gòu)建了一個(gè)簡(jiǎn)單的分頁(yè)條,v-bind指令作用于元素的class特性上。
這個(gè)指令包含一個(gè)表達(dá)式,表達(dá)式的含義是:高亮當(dāng)前頁(yè)。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="styles/demo.css" />
</head>
<body>
<div id="app">
<ul class="pagination">
<li v-for="n in pageCount">
<a href="javascripit:void(0)" v-bind:class="activeNumber === n + 1 ? 'active' : ''">{{ n + 1 }}</a>
</li>
</ul>
</div>
</body>
<script src="js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
activeNumber: 1,
pageCount: 10
}
})
</script>
</html>
注意v-for="n in pageCount"這行代碼,pageCount是一個(gè)整數(shù),遍歷時(shí)n從0開(kāi)始,然后遍歷到pageCount –1結(jié)束。

v-on指令
v-on指令用于給監(jiān)聽(tīng)DOM事件,它的用語(yǔ)法和v-bind是類(lèi)似的,例如監(jiān)聽(tīng)<a>元素的點(diǎn)擊事件:
<a v-on:click="doSomething">
有兩種形式調(diào)用方法:綁定一個(gè)方法(讓事件指向方法的引用),或者使用內(nèi)聯(lián)語(yǔ)句。
Greet按鈕將它的單擊事件直接綁定到greet()方法,而Hi按鈕則是調(diào)用say()方法。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="app">
<p><input type="text" v-model="message"></p>
<p>
<!--click事件直接綁定一個(gè)方法-->
<button v-on:click="greet">Greet</button>
</p>
<p>
<!--click事件使用內(nèi)聯(lián)語(yǔ)句-->
<button v-on:click="say('Hi')">Hi</button>
</p>
</div>
</body>
<script src="js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
message: 'Hello, Vue.js!'
},
// 在 `methods` 對(duì)象中定義方法
methods: {
greet: function() {
// // 方法內(nèi) `this` 指向 vm
alert(this.message)
},
say: function(msg) {
alert(msg)
}
}
})
</script>
</html>

v-bind和v-on的縮寫(xiě)
Vue.js為最常用的兩個(gè)指令v-bind和v-on提供了縮寫(xiě)方式。v-bind指令可以縮寫(xiě)為一個(gè)冒號(hào),v-on指令可以縮寫(xiě)為@符號(hào)。
<!--完整語(yǔ)法-->
<a href="javascripit:void(0)" v-bind:class="activeNumber === n + 1 ? 'active' : ''">{{ n + 1 }}</a>
<!--縮寫(xiě)語(yǔ)法-->
<a href="javascripit:void(0)" :class="activeNumber=== n + 1 ? 'active' : ''">{{ n + 1 }}</a>
<!--完整語(yǔ)法-->
<button v-on:click="greet">Greet</button>
<!--縮寫(xiě)語(yǔ)法-->
<button @click="greet">Greet</button>
綜合示例
現(xiàn)在我們已經(jīng)介紹了一些Vue.js的基礎(chǔ)知識(shí)了,結(jié)合以上知識(shí)我們可以來(lái)做個(gè)小Demo。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="styles/demo.css" />
</head>
<body>
<div id="app">
<fieldset>
<legend>
Create New Person
</legend>
<div class="form-group">
<label>Name:</label>
<input type="text" v-model="newPerson.name"/>
</div>
<div class="form-group">
<label>Age:</label>
<input type="text" v-model="newPerson.age"/>
</div>
<div class="form-group">
<label>Sex:</label>
<select v-model="newPerson.sex">
<option value="Male">Male</option>
<option value="Female">Female</option>
</select>
</div>
<div class="form-group">
<label></label>
<button @click="createPerson">Create</button>
</div>
</fieldset>
<table>
<thead>
<tr>
<th>Name</th>
<th>Age</th>
<th>Sex</th>
<th>Delete</th>
</tr>
</thead>
<tbody>
<tr v-for="person in people">
<td>{{ person.name }}</td>
<td>{{ person.age }}</td>
<td>{{ person.sex }}</td>
<td :class="'text-center'"><button @click="deletePerson($index)">Delete</button></td>
</tr>
</tbody>
</table>
</div>
</body>
<script src="js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
newPerson: {
name: '',
age: 0,
sex: 'Male'
},
people: [{
name: 'Jack',
age: 30,
sex: 'Male'
}, {
name: 'Bill',
age: 26,
sex: 'Male'
}, {
name: 'Tracy',
age: 22,
sex: 'Female'
}, {
name: 'Chris',
age: 36,
sex: 'Male'
}]
},
methods:{
createPerson: function(){
this.people.push(this.newPerson);
// 添加完newPerson對(duì)象后,重置newPerson對(duì)象
this.newPerson = {name: '', age: 0, sex: 'Male'}
},
deletePerson: function(index){
// 刪一個(gè)數(shù)組元素
this.people.splice(index,1);
}
}
})
</script>
</html>

在我的GitHub Pages查看該Demo:
總結(jié)
本文簡(jiǎn)單介紹了Vue.js的MVVM模型和它的雙向綁定機(jī)制,然后以一個(gè)Hello World示例開(kāi)始了我們的Vue.js之旅,接著我們了解了幾個(gè)比較常用的指令,最后根據(jù)這些知識(shí)我們構(gòu)建了一個(gè)簡(jiǎn)單的示例。
本文已被整理到了《Vue.js前端組件學(xué)習(xí)教程》,歡迎大家學(xué)習(xí)閱讀。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解Vue.js——60分鐘組件快速入門(mén)(上篇)
- 學(xué)習(xí)vue.js條件渲染
- 學(xué)習(xí)vue.js計(jì)算屬性
- Vue.js路由組件vue-router使用方法詳解
- Vue.js組件tabs實(shí)現(xiàn)選項(xiàng)卡切換效果
- Vue.js第三天學(xué)習(xí)筆記(計(jì)算屬性computed)
- 基于vue.js實(shí)現(xiàn)圖片輪播效果
- Vue.js實(shí)現(xiàn)簡(jiǎn)單ToDoList 前期準(zhǔn)備(一)
- vue.js實(shí)現(xiàn)表格合并示例代碼
- 用Vue.js實(shí)現(xiàn)監(jiān)聽(tīng)屬性的變化
- Vue.js開(kāi)發(fā)環(huán)境搭建
- JavaScript之Vue.js【入門(mén)基礎(chǔ)】
相關(guān)文章
Vue項(xiàng)目實(shí)現(xiàn)文件下載進(jìn)度條功能
大文件下載,花費(fèi)的時(shí)間比較長(zhǎng),沒(méi)有任何提示,用戶體驗(yàn)很差,需要優(yōu)化,提示文件在下載中,并且顯示進(jìn)度百分比,下面小編給大家?guī)?lái)了Vue項(xiàng)目實(shí)現(xiàn)文件下載進(jìn)度條功能,感興趣的朋友一起看看吧2024-03-03
解決vue中修改了數(shù)據(jù)但視圖無(wú)法更新的情況
今天小編就為大家分享一篇解決vue中修改了數(shù)據(jù)但視圖無(wú)法更新的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Vue實(shí)現(xiàn)下載文件而非瀏覽器直接打開(kāi)的方法
對(duì)于瀏覽器來(lái)說(shuō),文本、圖片等可以直接打開(kāi)的文件,不會(huì)進(jìn)行自動(dòng)下載,下面這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)下載文件而非瀏覽器直接打開(kāi)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
element基于el-form智能的FormSmart表單組件
本文主要介紹了element基于el-form智能的FormSmart表單組件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Vue3?實(shí)現(xiàn)網(wǎng)頁(yè)背景水印功能的示例代碼
vant-ui框架的一個(gè)bug(解決切換后onload不觸發(fā))

