免費的中文logo網(wǎng)站sem投放
模板語法
Vue.js 使用了基于 HTML 的模板語法,允許開發(fā)者聲明式地將 DOM 綁定至底層 Vue 實例的數(shù)據(jù)。所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循規(guī)范的瀏覽器和 HTML 解析器解析。vue將模板編譯成虛擬dom,
結(jié)合響應系統(tǒng),Vue 能夠智能地計算出最少需要重新渲染多少組件,并把 DOM 操作次數(shù)減到最少。
html模板語法:
這是一種基于字符串的模板技術,以字符串和數(shù)據(jù)為輸入,通過用正則表達式將占位符替換為所需數(shù)據(jù)的方式,構建出完整的 HTML 字符串。
插值
文本
使用{{msg}}的形式,標簽將會被替換成為數(shù)據(jù)對象(data)上msg屬性值,當綁定的數(shù)據(jù)對象上的msg屬性值發(fā)生變化時,插值處的值也會發(fā)生變化(雙向綁定)
示例:上節(jié)課的hello vue示例使用的就是插值。
html
{{}}的方式將數(shù)據(jù)處理為普通文本,如果要輸出html,需要使用v-html指令
示例:
在data中定義一個html屬性,其值為html
data: {
? ? html: ?'<input type="text" value="hello"/>'
}
1
2
3
在html中取值
<span v-html="html"></span>
1
屬性
HTML屬性中的值應使用v-bind指令。類型與jQuery中的$(“#xxx”).attr(propName, propVal)
示例,以修改元素的class屬性為例:
定義一個樣式
<style>
.redClass {
? ? font-size: 30px;
? ? color: red;
}
</style>
1
2
3
4
5
6
在data中定義一個屬性,其值為上面定義的樣式名
data: {
? ? red: 'redClass'
}
1
2
3
在html使用v-bind指令設置樣式
<p>設置之前: ?aaaa</p>
<p>設置之后: <span v-bind:class="red">aaa</span></p>
1
2
在瀏覽器中可以看到相應的效果
表達式
幾種常見的表達式:
{{str.substr(0,6).toUpperCase()}}
{{ number + 1 }}
{{ ok ? ‘YES’ : ‘NO’ }} 三元運算符
我的Id是js動態(tài)生成的
示例1:
在html中加入元素,定義表達式
<span>{{str.substr(0,6).toUpperCase()}}</span>
在data中加入一個屬性,名為str與html中對應
data: {
? ? str: 'hello vue'
}
查看效果:字符串被截取,并轉(zhuǎn)換為大寫
1
2
3
4
5
6
7
8
9
示例2:
<span>{{ number + 1 }}</span>
在data中加入一個屬性,名為str與html中對應
data: {
? ? number: 10
}
在data中定義的number值將會被加1
1
2
3
4
5
6
示例3:
這是一個三元運算,如果ok為true,表達式值為YES ,如果ok為false則表達式值為NO
<span>{{ ok ? 'YES' : 'NO' }}</span>
在data中加入一個屬性,名為str與html中對應
data: {
? ? ok: true
}
1
2
3
4
5
6
7
8
示例4:
演示id屬性綁定和動態(tài)賦值
<p>
? ? <input type="text" v-bind:id="bookId"/></br>
? ? <!--動態(tài)生成Id-->
? ? <input type="text" v-bind:id="'bookList_' + id"/>
</p>
data: {
? ? bookId: 'book001',
? ? id: 'book002'
}
該示例可以通過開發(fā)者工具查看生成的id屬性值。
1
2
3
4
5
6
7
8
9
10
11
12
指令
指令指的是帶有“v-"前綴的特殊屬性
1.2.1 核心指令
1.2.1.1 v-if |v-else-if|v-else
根據(jù)其后表達式的bool值進行判斷是否渲染該元素, 指令特性的值預期是單個 JavaScript 表達式 (v-for 是例外情況,稍后我們再討論)
示例:
<div v-if="type === 'A'">
? ? type == A
</div>
<div v-else-if="type === 'B'">
? ? type == B
</div>
<div v-else>
? ? other value
</div>
JS
? ? var vm = new Vue({
? ? ? ? el: '#app',
? ? ? ? data: {
? ? ? ? ? ? type: 'C'
? ? ? ? }
? ? });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
可以修改data中的type值觀察頁面的輸出。
注: js = == === 之間的區(qū)別
一個等號是賦值操作,==先轉(zhuǎn)換類型再比較,===先判斷類型,如果不是同一類型直接為false
alert(1 == “1”); // true
alert(1 === “1”); // false
1.2.1.2 v-show
與v-if類似,只是不會渲染其身后表達式為false的元素,而且會給這樣的元素添加css代碼:style=“display:none”。
當v-show 表達式true則顯示,否則不顯示。
注意:使用v-show,雖然不顯示,但在頁面的dom中是存在的,只是display屬性為none
示例: 在HTML中加入如下內(nèi)容
<div v-show="show === 'yes'">
? ? show == yes
</div>
在data中定義show屬性
var vm = new Vue({
? ? el: '#app',
? ? data: {
? ? ? ? show: 'yes'?
? ? }
});
1
2
3
4
5
6
7
8
9
10
11
修改show值,觀察頁面顯示
1.2.1.3 v-for
循環(huán)遍歷
遍歷數(shù)組: v-for=“item in items”, items是數(shù)組,item為數(shù)組中的數(shù)組元素
遍歷對象: v-for=“(value,key,index) in stu”, value屬性值, key屬性名,index下標
示例:
定義一個div,使用v-for指令輸出,items是vue實例中data中定義的對象數(shù)組
<!--數(shù)組-->
<div v-for="item in items">
? ? ?{{item.name}} -- {{item.id}}
</div>
<!--循環(huán)生成下拉列表-->
<div>
? ? <select >
? ? ? ? <option v-for="item in items"?
? ? ? ? ? ? v-bind:value="item.id">{{item.name}}</option>
? ? </select>
</div>
<!--對象-->
<div v-for="(o,key) in obj">
? ? {{key}}-{{o}}
</div>
var vm = new Vue({
? ? el: '#app',
? ? data: {
? ? ? ? itmes:[
? ? ? ? ? ? {name: 'zs',age:18},
? ? ? ? ? ? {name: 'ww',age:19},
? ? ? ? ? ? {name: 'ls',age:20},
? ? ? ? ? ? {name: 'zl',age:21}
? ? ? ? ],
? ? ? ? obj: {
? ? ? ? ? ? name:'張三',
? ? ? ? ? ? age: 21,
? ? ? ? ? ? addr: '湖南長沙'
? ? ? ? }
? ? }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
1.2.1.4 v-on|v-model|v-for
創(chuàng)建一組多選框,可以獲取到用戶選擇項
<div v-for="(item,index) in items">
? ? {{index}}:<input type="checkbox" v-bind:value="item.id"
? ? ? ? ? ? v-model="selected">{{item.name}}
</div>
<button v-on:click="getSelected()">獲取選擇</button>
var vm = new Vue({
? ? el: '#app',
? ? data: {
? ? ? ? type: 'C',
? ? ? ? show: 'no',
? ? ? ? items:[
? ? ? ? ? ? {name: '長沙',id:18},
? ? ? ? ? ? {name: '昆明',id:19},
? ? ? ? ? ? {name: '武漢',id:20},
? ? ? ? ? ? {name: '南京',id:21}
? ? ? ? ],
? ? ? ? obj: {
? ? ? ? ? ? name:'張三',
? ? ? ? ? ? age: 21,
? ? ? ? ? ? addr: '湖南長沙'
? ? ? ? },
? ? ? ? selected:[]
? ? },
? ? methods: {
? ? ? ? getSelected: function() {
? ? ? ? ? ? console.log(this.selected);
? ? ? ? }
? ? }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1.2.1.5 參數(shù) v-bind:href,v-on:click
示例:
<!--參數(shù):href-->
<div>
? ? <a v-bind:href="url">baidu</a>
</div>
<!--
參數(shù):動態(tài)參數(shù).
attname需要在data中定義,
注意:attname要全部小寫!!
-->
<div>
? ? <a v-bind:[attrname]="url">baidu</a>
? ? <button v-on:[evname]="clickme">點我看看</button>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
注意:在動態(tài)參數(shù)中,作為參數(shù)的變量名(如:attrname)要全部小寫,否則無效 !!
var vm = new Vue({
? ? el: '#app',
? ? data: {
? ? ? ? url: 'https://www.baidu.com',
? ? ? ? attrname:'href',
? ? ? ? evname: 'click'
? ? },
? ? methods: {
? ? ? ? clickme: function() {
? ? ? ? ? ? console.log("點到我了");
? ? ? ? }
? ? }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1.2.1.6 簡寫
Vue為v-bind和v-on這兩個最常用的指令,提供了特定簡寫
指令 簡寫 示例
v-bind:xxx :xxx v-bind:href 簡寫為 :href
v-on:xxx @xxx v-on:click 簡寫為 @click
2. 過濾器
vue允許自定義過濾器,一般用于常見的文本格式化,過濾器可用的兩個地方:雙花括號插值與v-bind表達式,過濾器應該被添加在js表達式的尾部,使用管道運算符"|"
2.1 局部過濾器
局部過濾器的定義:
var vm = new Vue({
? ? filters: {
? ? ? ? 'filterName': function(value) {
? ? ? ? ? ? //過濾器實現(xiàn)
? ? ? ? }
? ? }
});
過濾器的使用
<!--雙花括號中的使用-->
{{ name | capitalize }}
1
2
3
4
5
6
7
8
9
10
11
注1:過濾器函數(shù)接受表達式的值作為第一個參數(shù) 注2:過濾器可以串聯(lián) {{ message | filterA | filterB }} 注3:過濾器是JavaScript函數(shù),因此可以接受參數(shù): {{ message | filterA('arg1', arg2) }} 示例:
<div>
? ? <p>{{msg | toUpperCase}}</p>
</div>
var vm = new Vue({
? ? el: '#app',
? ? data: {
? ? ? ? msg:"hello vue"
? ? },
? ? //局部過濾器
? ? filters:{
? ? ? ? toUpperCase: function(value) {
? ? ? ? ? ? return value.toUpperCase();
? ? ? ? }
? ? }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2.2 全局過濾器
拷入date.js(日期格式化)放入項目js目錄中,在頁面中引入。
定義全局過濾器
//全局過濾器
Vue.filter('fmtDate',function(value) {
? ? return fmtDate(value, 'yyyy年MM月dd日')
});
1
2
3
過濾器的使用
<div>
? ? <p>{{date | fmtDate}}</p>
</div>
1
2
3
計算屬性
計算屬性用于快速計算視圖(View)中顯示的屬性,這些計算將被緩存,并且只在需要時更新
使用場景:當一個屬性需要復雜的邏輯運算之后才能獲取其值,可以使用計算屬性,在一個計算屬性中可以完成各種復雜的邏輯,包括運算,方法調(diào)用等,只要最終返回一個結(jié)果就可以了
聲明計算屬性的格式:
computed:{
? ?xxx:function(){
?}
}
1
2
3
4
示例: 使用計算屬性,計算書本的總價
定義測試數(shù)據(jù),和計算屬性,計算屬性遍歷書本記錄,計算總價
var vm = new Vue({
? ? el: '#app',
? ? data: {
? ? ? ? //定義測試數(shù)據(jù)
? ? ? ? books: [
? ? ? ? ? ? {name:'紅樓夢', price:"120"},
? ? ? ? ? ? {name:'三國演義', price:"100"},
? ? ? ? ? ? {name:'水滸傳', price:"90"},
? ? ? ? ]
? ? },
? ? //計算屬性
? ? computed: {
? ? ? ? compTotal: function() {
? ? ? ? ? ? let sum = 0;
? ? ? ? ? ? for(index in this.books) {
? ? ? ? ? ? ? ? sum += parseInt(this.books[index].price);
? ? ? ? ? ? }
? ? ? ? ? ? return sum;
? ? ? ? }
? ? }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
計算屬性在頁面中的使用
<div v-for="book in books">
? ? {{book.name}} -> {{book.price}}
</div>
<div>
? ? 總價:{{compTotal}}
</div>
1
2
3
4
5
6
7
關于var 與 let
var聲明為全局屬性
let為ES6新增,可以聲明塊級作用域的變量(局部變量)
建議使用let聲明變量
4.監(jiān)聽屬性
使用場景:我們可以使用監(jiān)聽屬性watch來響應數(shù)據(jù)的變量, 當需要在數(shù)據(jù)變化時執(zhí)行異步或開銷較大的操作時,這種方式比較有用。回想一下是否做過下拉列表的級聯(lián)選擇?
watch聲明語法:
watch: {
? ? xxxx: function(val) {
? ? ? ? //監(jiān)聽器實現(xiàn)
? ? }
}
1
2
3
4
5
示例: 米和厘米的單位換算
設置監(jiān)聽器:
var vm = new Vue({
? ? el: '#app',
? ? data: {
? ? ? ? m: 1,
? ? ? ? cm: 100
? ? },
? ? //設置監(jiān)聽屬性
? ? watch: {
? ? ? ? m: function(val) {
? ? ? ? ? ? if(val)
? ? ? ? ? ? ? ? this.cm = parseInt(val) * 100;
? ? ? ? ? ? else
? ? ? ? ? ? ? ? this.cm = "";
? ? ? ? },
? ? ? ? cm: function(val) {
? ? ? ? ? ? if(val)
? ? ? ? ? ? ? ? this.m = parseInt(val) / 100;
? ? ? ? ? ? else
? ? ? ? ? ? ? ? this.m = "";
? ? ? ? }
? ? }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
HTML中使用v-model實現(xiàn)與數(shù)據(jù)的雙向綁定
<div>
? ? <!--注意v-model的雙向綁定-->
? ? 米: ? ? <input type="text" v-model="m">
? ? 厘米: ?<input type="text" v-model="cm">
</div>
———————————————