Vue學習(一)概念及常見命令介紹
Vue.js介紹
Vue.js是JavaScript MVVM(Model-View-ViewModel)庫,十分簡潔,Vue核心只關注檢視層,相對AngularJS提供更加簡潔、易於理解的API。Vue儘可能通過簡單的API實現響應的資料繫結和組合的檢視元件。
Vue和MVVM模式
MVVM模式即Model-View-ViewModel。
Vue是以資料為驅動的,Vue自身將DOM和資料進行繫結,一旦建立繫結,DOM和資料將保持同步,每當資料發生變化,DOM會跟著變化。
ViewModel是Vue的核心,它是Vue的一個例項。Vue例項時作用域某個HTML元素上的,這個HTML元素可以是body
DOM Listeners和Data Bindings是實現雙向繫結的關鍵。DOM Listeners監聽頁面所有View層DOM元素的變化,當發生變化,Model層的資料隨之變化;Data Bindings監聽Model層的資料,當資料發生變化,View層的DOM元素隨之變化。
Vue.js特點
- 簡潔:頁面由HTML模板+Json資料+Vue例項組成
- 資料驅動:自動計算屬性和追蹤依賴的模板表示式
- 元件化:用可複用、解耦的元件來構造頁面
- 輕量:程式碼量小,不依賴其他庫
- 快速:精確有效批量DOM更新
- 模板友好:可通過npm,bower等多種方式安裝,很容易融入
Vue.js入門小例子
宣告式渲染
本例子由HTML模板(View)+Json資料(Model)+Vue例項(ViewModel)組成。
建立Vue的例項,需傳入一個選項物件,如:資料、掛載元素、方法、模生命週期鉤子等。本例子中,選項物件的el
屬性為#app
,表示Vue例項掛載在<div id="app">...</div>
元素上,data
屬性為exampleData
,表示Model為exampleData
。View中{{message}}
是Vue的一種資料繫結語法,在執行時,{{message}}
會被資料物件的message
屬性替換。
<!DOCTYPE html>
<html>
<head>
<title>宣告式渲染</title>
<meta charset="utf-8">
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<!-- View -->
<div id="app">
{{message}}
</div>
<script>
//Model
var exampleData = {
message: 'Hello Vue!'
}
//ViewModel
var app = new Vue({
el: '#app',
data: exampleData
})
</script>
</body>
</html>
雙向繫結
在Vue中使用v-model在表單元素上實現雙向繫結。當在輸入框輸入的資訊發生變化,<p>...</p>
中的資訊隨之變化;當通過控制檯中的Console,修改exampleData.message
的值,輸入框中的資訊也隨之變化。
<!DOCTYPE html>
<html lang="en">
<head>
<title>雙向繫結</title>
<meta charset="utf-8">
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<!-- View -->
<div id="app">
<p>{{message}}</p>
<input type="text" v-model="message">
</div>
<script>
//Model
var exampleData = {
message: 'Hello Vue!'
}
//ViewModel
var app = new Vue({
el: '#app',
data: exampleData
})
</script>
</body>
</html>
執行截圖:
更改exampleData.message
:
Vue.js常用指令
Vue指令以v-開頭,作用在HTML元素上,將指令繫結在元素上時,會給繫結的元素新增一些特殊行為,可將指令視作特殊的HTML屬性(attribute)。
下面將介紹Vue中常用的幾個內建指令。當然,Vue除了內建指令,也可以根據需求自定義指令。
v-if指令
條件判斷指令,根據表示式值的真假來插入或刪除元素,表示式返回一個布林值,語法如下:
v-if = "expression"
例子:
在本例中,表示式是yes
,no
,和age>25
,yes
的值為true,因此在HTML中顯示該元素,其他同理。
<!DOCTYPE html>
<html lang="en">
<head>
<title>v-if指令</title>
<meta charset="utf-8">
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h1 v-if="yes">Yes</h1>
<h1 v-if="no">No</h1>
<h1 v-if="age > 25">Age: {{age}}</h1>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
yes: true,//值為真,插入元素
no: false,//值為假,不插入元素
age: 28
}
})
</script>
</body>
</html>
執行截圖:
v-show指令
條件渲染指令,與v-if不同的是,無論v-show的值為true
或false
,元素都會存在於HTML程式碼中;而只有當v-if的值為true,元素才會存在於HTML程式碼中。v-show指令只是設定了元素CSS的style值。語法如下:
v-show = "expression"
例子:
<!DOCTYPE html>
<html lang="en">
<head>
<title>v-show指令</title>
<meta charset="utf-8">
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h1 v-show="yes">Yes</h1>
<h1 v-show="no">No</h1>
<h1 v-show="age > 25">Age: {{age}}</h1>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
yes: true,//值為真
no: false,//值為假
age: 28
}
})
</script>
</body>
</html>
執行截圖:
v-else指令
可配合v-if或v-show使用,v-else指令必須緊鄰v-if或v-show,否則該命令無法正常工作。v-else繫結的元素能否渲染在HTML中,取決於前面使用的是v-if還是v-show。若前面使用的是v-if,且v-if值為true,則v-else元素不會渲染;若前面使用的是v-show,且v-show值為true,則v-else元素仍會渲染到HTML。
v-for指令
迴圈指令,基於一個數組渲染一個列表,與JavaScript遍歷類似,語法如下:
v-for = "item in items"
例子:
在本例中,陣列是todos
,依次遍歷陣列todos
中的每個元素,將text部分顯示。
<!DOCTYPE html>
<html lang="en">
<head>
<title>v-for指令</title>
<meta charset="utf-8">
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<ol>
<li v-for="todo in todos">{{todo.text}}</li>
</ol>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
todos: [
{text: 'learn Javascript'},
{text: 'learn Vue'},
{text: 'learn ...'}
]
}
})
</script>
</body>
</html>
執行截圖:
在瀏覽器控制檯裡Console,輸入app.todos.push({text: 'new item'})
,則會插入新的一條資訊。
執行截圖:
v-bind指令
給DOM繫結元素屬性,語法如下:
v-bind:argument="expression"
其中,argument通常是HTML元素的特性,如:v-bind:class="expression"
。
注:v-bind指令可以縮寫為:
冒號。如::class="expression"
。
例子:
在本例子中,當滑鼠懸停在span標籤的文字上時,會顯示載入網頁的時間。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<span v-bind:title="message">Hover your mouse over me</span>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
message: 'you loaded this page on ' + new Date()
}
})
</script>
</body>
</html>
v-on指令
用於監聽DOM事件,語法與v-bind類似,如監聽點選事件v-on:click="doSth"
。
注:v-on指令可以縮寫為@符號。如:@click="doSth"
。
例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<p><input type="text" v-model="message"></p>
<p>
<button v-on:click="greet">Greet</button>
</p>
<p>
<button v-on:click="say('hello vue')">Hello</button>
</p>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
message: 'Greet to Vue'
},
methods: {
greet: function(){
alert(this.message);
},
say: function(msg){
alert(msg);
}
}
})
</script>
</body>
</html>
執行結果:
一個綜合性例子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<fieldset>
<legend>Create New</legend>
<label for="">Name:</label>
<input type="text" v-model="newPerson.name">
<label for="">Age:</label>
<input type="text" v-model="newPerson.age">
<label for="">Age:</label>
<select name="" id="" v-model="newPerson.sex">
<option value="Male">Male</option>
<option value="Female">Female</option>
</select>
<button @click="createPerson">Create</button>
</fieldset>
<table>
<tr>
<th>Name</th>
<th>Age</th>
<th>Sex</th>
<th>Delete</th>
</tr>
<tr v-for="person in people">
<td>{{person.name}}</td>
<td>{{person.age}}</td>
<td>{{person.sex}}</td>
<td><button @click="deletePerson($index)">Delete</button></td>
</tr>
</table>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
newPerson: {
name: '',
age: 0,
sex: 'Male'
},
people: [{
name: 'tyy',
age: 24,
sex: 'Male'
}, {
name: 'syd',
age: 24,
sex: 'Female'
}]
},
methods: {
createPerson: function(){
this.people.push(this.newPerson);
this.newPerson = {
name: '',
age: 0,
sex: 'Male'
}
},
deletePerson: function(index){
this.people.splice(index, 1);
}
}
})
</script>
</body>
</html>
執行截圖: