一:循環(huán)語(yǔ)句
Vue.js
循環(huán)語(yǔ)句关带,循環(huán)使用 v-for 指令侥涵。
v-for 指令
需要以 site in sites
形式的特殊語(yǔ)法,sites
是源數(shù)據(jù)數(shù)組并且 site 是數(shù)組元素迭代的別名宋雏。
v-for
可以綁定數(shù)據(jù)到數(shù)組
來(lái)渲染一個(gè)列表:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<ol>
<li v-for="site in sites">
{{ site.name }}
</li>
</ol>
</div>
<script>
new Vue({
el: '#app',
data: {
sites: [
{ name: 'Runoob' },
{ name: 'Google' },
{ name: 'Taobao' }
]
}
})
</script>
</body>
</html>
運(yùn)行結(jié)果:
1. Runoob
2. Google
3. Taobao
v-for 迭代對(duì)象
v-for 可以通過(guò)一個(gè)對(duì)象的屬性來(lái)迭代數(shù)據(jù):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="value in object">
{{ value }}
</li>
</ul>
</div>
<script>
new Vue({
el: '#app',
data: {
object: {
name: '菜鳥(niǎo)教程',
url: 'http://www.runoob.com',
slogan: '學(xué)的不僅是技術(shù)芜飘,更是夢(mèng)想!'
}
}
})
</script>
</body>
</html>
運(yùn)行結(jié)果:
菜鳥(niǎo)教程
http://www.runoob.com
學(xué)的不僅是技術(shù)磨总,更是夢(mèng)想嗦明!
你也可以提供第二個(gè)的參數(shù)為鍵名:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="(value, key) in object">
{{ key }} : {{ value }}
</li>
</ul>
</div>
<script>
new Vue({
el: '#app',
data: {
object: {
name: '菜鳥(niǎo)教程',
url: 'http://www.runoob.com',
slogan: '學(xué)的不僅是技術(shù),更是夢(mèng)想蚪燕!'
}
}
})
</script>
</body>
</html>
運(yùn)行結(jié)果:
name : 菜鳥(niǎo)教程
url : http://www.runoob.com
slogan : 學(xué)的不僅是技術(shù)娶牌,更是夢(mèng)想官套!
第三個(gè)參數(shù)為索引:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="(value, key, index) in object">
{{ index }}. {{ key }} : {{ value }}
</li>
</ul>
</div>
<script>
new Vue({
el: '#app',
data: {
object: {
name: '菜鳥(niǎo)教程',
url: 'http://www.runoob.com',
slogan: '學(xué)的不僅是技術(shù)秘豹,更是夢(mèng)想!'
}
}
})
</script>
</body>
</html>
運(yùn)行結(jié)果:
0. name : 菜鳥(niǎo)教程
1. url : http://www.runoob.com
2. slogan : 學(xué)的不僅是技術(shù),更是夢(mèng)想他宛!
v-for 迭代整數(shù)
v-for 也可以循環(huán)整數(shù)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="n in 10">
{{ n }}
</li>
</ul>
</div>
<script>
new Vue({
el: '#app'
})
</script>
</body>
</html>
運(yùn)行結(jié)果:
1
2
3
4
5
6
7
8
9
10
二:監(jiān)聽(tīng)屬性
Vue.js 監(jiān)聽(tīng)屬性 watch,我們可以通過(guò) watch 來(lái)響應(yīng)數(shù)據(jù)的變化
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id = "app">
<p style = "font-size:25px;">計(jì)數(shù)器: {{ counter }}</p>
<button @click = "counter++" style = "font-size:25px;">點(diǎn)我</button>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#app',
data: {
counter: 1
}
});
vm.$watch('counter', function(nval, oval) {
alert('計(jì)數(shù)器值的變化 :' + oval + ' 變?yōu)?' + nval + '!');
});
</script>
</body>
</html>
運(yùn)行結(jié)果:
QQ20210817-102948-HD.gif
以下實(shí)例進(jìn)行千米與米之間的換算:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id = "computed_props">
千米 : <input type = "text" v-model = "kilometers">
米 : <input type = "text" v-model = "meters">
</div>
<p id="info"></p>
<script type = "text/javascript">
var vm = new Vue({
el: '#computed_props',
data: {
kilometers : 0,
meters:0
},
methods: {
},
computed :{
},
watch : {
kilometers:function(val) {
this.kilometers = val;
this.meters = this.kilometers * 1000
},
meters : function (val) {
this.kilometers = val/ 1000;
this.meters = val;
}
}
});
// $watch 是一個(gè)實(shí)例方法
vm.$watch('kilometers', function (newValue, oldValue) {
// 這個(gè)回調(diào)將在 vm.kilometers 改變后調(diào)用
document.getElementById ("info").innerHTML = "修改前值為: " + oldValue + "卿吐,修改后值為: " + newValue;
})
</script>
</body>
</html>
運(yùn)行結(jié)果:
QQ20210817-104505-HD.gif
二:樣式綁定
class
與style
是 HTML
元素的屬性富弦,用于設(shè)置元素的樣式,我們可以用 v-bind
來(lái)設(shè)置樣式屬性壹罚。
v-bind
在處理 class
和 style
時(shí)葛作, 專(zhuān)門(mén)增強(qiáng)了它。表達(dá)式的結(jié)果類(lèi)型除了字符串之外猖凛,還可以是對(duì)象或數(shù)組赂蠢。
class
屬性綁定
我們可以為 v-bind:class 設(shè)置一個(gè)對(duì)象,從而動(dòng)態(tài)的切換 class:
實(shí)例中將 isActive 設(shè)置為 true 顯示了一個(gè)綠色的 div 塊辨泳,如果設(shè)置為 false 則不顯示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<style>
.active {
width: 100px;
height: 100px;
background: green;
}
</style>
</head>
<body>
<div id="app">
<div v-bind:class="{ 'active': isActive }"></div>
</div>
<script>
new Vue({
el: '#app',
data: {
isActive: true
}
})
</script>
</body>
</html>
運(yùn)行結(jié)果:
image.png
再看一個(gè)demo1:
text-danger 類(lèi)背景顏色覆蓋了 active 類(lèi)的背景色:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<style>
.active {
width: 100px;
height: 100px;
background: green;
}
.text-danger {
background: red;
}
</style>
</head>
<body>
<div id="app">
<div class="static"
v-bind:class="{ 'active': isActive, 'text-danger': hasError }">
</div>
</div>
<script>
new Vue({
el: '#app',
data: {
isActive: true,
hasError: true
}
})
</script>
</body>
</html>
運(yùn)行結(jié)果:
image.png
再看一個(gè)demo2:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<style>
.active {
width: 100px;
height: 100px;
background: green;
}
.text-danger {
background: red;
}
</style>
</head>
<body>
<div id="app">
<div v-bind:class="classObject"></div>
</div>
<script>
new Vue({
el: '#app',
data: {
classObject: {
active: true,
'text-danger': true
}
}
})
</script>
</body>
</html>
運(yùn)行結(jié)果:
image.png
再看一個(gè)demo3:
我們還可以使用三元表達(dá)式來(lái)切換列表中的 class :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<style>
.active {
width: 100px;
height: 100px;
background: green;
}
.text-danger {
background: red;
}
</style>
</head>
<body>
<div id="app">
<div class="static"
v-bind:class="{ 'active': isActive, 'text-danger': hasError }">
</div>
</div>
<script>
new Vue({
el: '#app',
data: {
isActive: true,
hasError: true
}
})
</script>
</body>
</html>
運(yùn)行結(jié)果:
image.png
數(shù)組語(yǔ)法
可以把一個(gè)數(shù)組傳給 v-bind:class 虱岂,實(shí)例如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<style>
.active {
width: 100px;
height: 100px;
background: green;
}
.text-danger {
background: red;
}
</style>
</head>
<body>
<div id="app">
<div v-bind:class="[activeClass, errorClass]"></div>
</div>
<script>
new Vue({
el: '#app',
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
})
</script>
</body>
</html>
運(yùn)行結(jié)果:
image.png
demo2:
errorClass 是始終存在的,isActive 為 true 時(shí)添加 activeClass 類(lèi):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<style>
.text-danger {
width: 100px;
height: 100px;
background: red;
}
.active {
width: 100px;
height: 100px;
background: green;
}
</style>
</head>
<body>
<div id="app">
<div v-bind:class="[errorClass ,isActive ? activeClass : '']"></div>
</div>
<script>
new Vue({
el: '#app',
data: {
isActive: true,
activeClass: 'active',
errorClass: 'text-danger'
}
})
</script>
</body>
</html>
運(yùn)行結(jié)果:
image.png
三:內(nèi)聯(lián)樣式
可以在 v-bind:style 直接設(shè)置樣式:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }">菜鳥(niǎo)教程</div>
</div>
<script>
new Vue({
el: '#app',
data: {
activeColor: 'green',
fontSize: 30
}
})
</script>
</body>
</html>
結(jié)果:
image.png
demo2如下:
直接綁定到一個(gè)樣式對(duì)象菠红,讓模板更清晰
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<div v-bind:style="styleObject">菜鳥(niǎo)教程</div>
</div>
<script>
new Vue({
el: '#app',
data: {
styleObject: {
color: 'green',
fontSize: '30px'
}
}
})
</script>
</body>
</html>
結(jié)果:
image.png
demo3:
v-bind:style
可以使用數(shù)組將多個(gè)樣式對(duì)象應(yīng)用到一個(gè)元素上:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<div v-bind:style="[baseStyles, overridingStyles]">菜鳥(niǎo)教程</div>
</div>
<script>
new Vue({
el: '#app',
data: {
baseStyles: {
color: 'green',
fontSize: '30px'
},
overridingStyles: {
'font-weight': 'bold'
}
}
})
</script>
</body>
</html>
結(jié)果:
image.png
四:事件處理器
事件監(jiān)聽(tīng)可以使用v-on
指令:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<button v-on:click="counter += 1">增加 1</button>
<p>這個(gè)按鈕被點(diǎn)擊了 {{ counter }} 次第岖。</p>
</div>
<script>
new Vue({
el: '#app',
data: {
counter: 0
}
})
</script>
</body>
</html>
結(jié)果點(diǎn)擊一次就+1:
//點(diǎn)擊一次的結(jié)果
這個(gè)按鈕被點(diǎn)擊了 1 次。
通常情況下试溯,我們需要使用一個(gè)方法來(lái)調(diào)用 JavaScript 方法蔑滓。
v-on 可以接收一個(gè)定義的方法來(lái)調(diào)用
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<!-- `greet` 是在下面定義的方法名 -->
<button v-on:click="greet">Greet</button>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
name: 'Vue.js'
},
// 在 `methods` 對(duì)象中定義方法
methods: {
greet: function (event) {
// `this` 在方法里指當(dāng)前 Vue 實(shí)例
alert('Hello ' + this.name + '!')
// `event` 是原生 DOM 事件
if (event) {
alert(event.target.tagName)
}
}
}
})
// 也可以用 JavaScript 直接調(diào)用方法
app.greet() // -> 'Hello Vue.js!'
</script>
</body>
</html>
結(jié)果:
image.png
除了直接綁定到一個(gè)方法,也可以用內(nèi)聯(lián) JavaScript 語(yǔ)句:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<button v-on:click="say('hi')">Say hi</button>
<button v-on:click="say('what')">Say what</button>
</div>
<script>
new Vue({
el: '#app',
methods: {
say: function (message) {
alert(message)
}
}
})
</script>
</body>
</html>
image.png
image.png
四:事件修飾符
Vue.js
為v-on
提供了事件修飾符來(lái)處理 DOM 事件細(xì)節(jié)遇绞,如:event.preventDefault()
或 event.stopPropagation()
键袱。
Vue.js
通過(guò)由點(diǎn) .
表示的指令后綴來(lái)調(diào)用修飾符。
- .stop - 阻止冒泡
- .prevent - 阻止默認(rèn)事件
- .capture - 阻止捕獲
- .self - 只監(jiān)聽(tīng)觸發(fā)該元素的事件
- .once - 只觸發(fā)一次
- .left - 左鍵事件
- .right - 右鍵事件
- .middle - 中間滾輪事件
<!-- 阻止單擊事件冒泡 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重載頁(yè)面 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修飾符可以串聯(lián) -->
<a v-on:click.stop.prevent="doThat"></a>
<!-- 只有修飾符 -->
<form v-on:submit.prevent></form>
<!-- 添加事件偵聽(tīng)器時(shí)使用事件捕獲模式 -->
<div v-on:click.capture="doThis">...</div>
<!-- 只當(dāng)事件在該元素本身(而不是子元素)觸發(fā)時(shí)觸發(fā)回調(diào) -->
<div v-on:click.self="doThat">...</div>
<!-- click 事件只能點(diǎn)擊一次摹闽,2.1.4版本新增 -->
<a v-on:click.once="doThis"></a>
按鍵修飾符
Vue 允許為v-on
在監(jiān)聽(tīng)鍵盤(pán)事件時(shí)添加按鍵修飾符:
<!-- 只有在 keyCode 是 13 時(shí)調(diào)用 vm.submit() -->
<input v-on:keyup.13="submit">
記住所有的keyCode
比較困難蹄咖,所以 Vue 為最常用的按鍵提供了別名:
<!-- 同上 -->
<input v-on:keyup.enter="submit">
<!-- 縮寫(xiě)語(yǔ)法 -->
<input @keyup.enter="submit">
全部的按鍵別名:
- .enter
- .tab
- .delete (捕獲 "刪除" 和 "退格" 鍵)
- .esc
- .space
- .up
- .down
- .left
- .right
- .ctrl
- .alt
- .shift
- .meta
實(shí)例
<p><!-- Alt + C -->
<input @keyup.alt.67="clear">
<!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>