一章節(jié)我們探討了Vue的入門,對Vue有了初步的了解,并且掌握了模板語法。本節(jié)課我們的學(xué)習(xí)目標(biāo)是Vue的指令。
首先解釋以下什么叫做指令,指定就是命令的意思,人們用指令表達(dá)自己的意圖。Vue中有多種指令,每種指令有不同的功能,比如有個指令的名字叫做v-text,此指令用于主要用來更新html標(biāo)簽InnerText內(nèi)容,等同于JS操作dom元素的text屬性。
除此以外vue還提供了多種指令,接下來我們就開始詳細(xì)介紹這些指令的使用場景已經(jīng)使用方式。
我們已經(jīng)了解到Vue雖然使用場景與功能類似于JQuery,但是語法習(xí)慣完全不同于JQuery,比如Vue使用步驟主要有實例化Vue對象,掛載點使用模板語法綁定數(shù)據(jù)。除此以外Vue指令也是Vue使用中的重要組成部分,根據(jù)不同的指令有不同的功能,比如綁定事件,渲染InnerText數(shù)據(jù),渲染InnerHtml數(shù)據(jù)。
Vue中的指令存在的形式是以“v-”為前綴的特殊屬性,出現(xiàn)在html的標(biāo)簽的屬性部分,功能是當(dāng)表達(dá)式的值改變時,將其產(chǎn)生的連帶影響,響應(yīng)式地作用于 DOM。
Vue指令的組成部分如下所示。
<tag標(biāo)簽 v-指令名="表達(dá)式"> </tag標(biāo)簽>
無論是傳統(tǒng)的原生js,還是老牌前端框架JQuery,包括正在學(xué)習(xí)的Vue,他們的功能主要都是操作dom節(jié)點對象,我們這里再復(fù)習(xí)一下dom節(jié)點的相關(guān)概念,因為指令就是對DOM節(jié)點的操作。在 HTML DOM 中 , 每一個元素都是節(jié)點,Vue指令就是節(jié)點的特殊屬性。Vue.js是數(shù)據(jù)驅(qū)動的,無需手動操作DOM,它通過指令語法,將DOM和數(shù)據(jù)綁定起來。一旦創(chuàng)建了綁定,DOM將和數(shù)據(jù)保持同步,每當(dāng)變更了數(shù)據(jù),DOM也會相應(yīng)地更新。
Vue提供了多種內(nèi)置的指令,不同的指令有不同的功能,在具體學(xué)習(xí)每種指令之前,我們先將部分常見指令以表格形式進(jìn)行一覽,如圖2.1所示。
圖2.1 部分指令一覽
先描述一個場景:現(xiàn)有一組標(biāo)簽,此標(biāo)簽展示內(nèi)容只有在當(dāng)前用戶符合某些條件的情況下才顯示。
這種類型的功能在開發(fā)中是十分常見的,實現(xiàn)思路也很簡單,需要先進(jìn)行判斷是否符合條件,根據(jù)判斷結(jié)果來決定是否展示標(biāo)簽。在Vue中想要實現(xiàn)此種功能,就需要使用v-if指令。
我們使用v-if指令來實現(xiàn)剛才描述的場景,創(chuàng)建index.html文件,并使用上一章節(jié)中我們學(xué)習(xí)過的內(nèi)容快速加載Vue環(huán)境,這里就不在重新闡述。index.html中判斷當(dāng)前l(fā)evel的值是否大于等于10,如果大于10在頁面中顯示文字:“歡迎來自艾歐尼亞的最強王者上機!”如果levle的值小于10則什么都不顯示。為了實現(xiàn)此效果,我們需要使用到v-if指令。index.html代碼內(nèi)容如2-1所示:
例2-1 index.html
我們實現(xiàn)一個復(fù)雜的web應(yīng)用,少不了與用戶的交互,那么用戶交互最直接相關(guān)的就是事件,我們上一章學(xué)習(xí)的數(shù)據(jù)雙向綁定的v-model指令的底層就是用到了事件,所以VUE專門提供了事件處理這種語法結(jié)構(gòu),其實本質(zhì)上還是指令。所以我們稱之為事件綁定。之前我們學(xué)到了數(shù)據(jù)綁定,其實是類似的,數(shù)據(jù)綁定是將數(shù)據(jù)與模板綁定起來,只不過對于事件綁定來說,它綁定的是具體的操作。接下來我們學(xué)習(xí)下,VUE如何來處理事件。
1、VUE如何處理事件
<button v-on:click='count+=2'>點擊1</button>
<button @click='count+=2'>點擊2</button>
完整代碼:
<!DOCTYPE html>
<html lang="en">
<body>
<div id="app">
<div>{{count}}</div>
<button v-on:click='count+=2'>點擊1</button>
<button @click='count+=2'>點擊2</button>
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el:'#app',
data:{
count:0
}
});
</script>
</body>
</html>
展示效果圖:
2、事件函數(shù)的調(diào)用方式
以上我們調(diào)用事件是直接在指令內(nèi)寫的業(yè)務(wù)邏輯,那么如果比較復(fù)雜的業(yè)務(wù)邏輯再直接寫到指令內(nèi)那肯定是不合理了,這時我們要抽取函數(shù),通過事件函數(shù)的方式來調(diào)用,VUE中也專門提供了一個屬性(methods)用來定義我們需要的方法。
<button @click='todo'>點擊3</button>
<button @click='todo()'>點擊4</button>
完整代碼:
<!DOCTYPE html>
<html lang="en">
<body>
<div id="app">
<div>{{count}}</div>
<button @click='todo'>點擊3</button>
<button @click='todo()'>點擊4</button>
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el:'#app',
data:{
count:0
},
methods:{
todo:function(){
this.count+=2;
}
}
});
</script>
</body>
</html>
展示效果:
注意:在使用方法的時候,我們用到了this.count+,為什么用this呢,因為count在方法內(nèi)部,在方法內(nèi)部是沒辦法訪問這個屬性的,我們大可認(rèn)為data和methods是vm實例下的2個子域,他們2個是沒辦法直接交互的,只能往上通過父域(vm)來訪問,所以這里的this就是vm實例對象,比如我在方法內(nèi)部打印下console.log(this===vm) 返回的是true。
methods內(nèi)可以定義多個方法。
3、事件函數(shù)參數(shù)傳遞
如果我們的事件調(diào)用中不需要傳遞參數(shù),那么以上第一種(直接綁定函數(shù)名稱)比較方便一些;
如果我們的事件中需要傳遞參數(shù),我們只能通過以上第二種(調(diào)用函數(shù))的方式進(jìn)行函數(shù)調(diào)用;
當(dāng)我們需要傳遞參數(shù)的時候,根據(jù)入?yún)⒌姆诸惪梢苑譃槠胀▍?shù)和事件對象,下邊來看下事件函數(shù)如何來傳遞這2中類型的參數(shù):
<button @click='todo(11,22,$event)'>點擊</button>
完整代碼:
<!DOCTYPE html>
<html lang="en">
<body>
<div id="app">
<div>{{count}}</div>
<button @click='todo(11,22,$event)'>點擊</button>
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el:'#app',
data:{
count:0
},
methods:{
todo:function(p1,p2,event){
console.log(p1);
console.log(p2);
console.log(event.target.tagName + " " + event.target.innerHTML);
this.count+=2;
}
}
});
</script>
</body>
</html>
展示效果圖:
其實,我們通過第一種方式(直接綁定函數(shù)名稱)來調(diào)用函數(shù)的時候,是沒辦法從傳遞普通參數(shù)的,但是它默認(rèn)綁定了事件對象。我們可以在方法內(nèi)部直接獲取事件。
<!DOCTYPE html>
<html lang="en">
<body>
<div id="app">
<div>{{count}}</div>
<button @click='todo'>點擊</button>
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el:'#app',
data:{
count:0
},
methods:{
todo:function(event){
console.log(event.target.tagName + " " + event.target.innerHTML);
this.count+=2;
}
}
});
</script>
</body>
</html>
展示效果:
總結(jié):參數(shù)傳遞
1、如果事件直接綁定的是函數(shù)名稱(直接綁定函數(shù)名稱 todo),那么默認(rèn)會傳遞事件對象作為事件函數(shù)的第一個參數(shù)
2、如果事件函數(shù)綁定的是函數(shù)調(diào)用(函數(shù)調(diào)用 todo()),那么事件對象必須作為最后一個參數(shù)顯示的傳遞,并且事件對象的名稱必須是$event
4、事件修飾符
下邊來看個例子:
<!DOCTYPE html>
<html lang="en">
<body>
<div id="app">
<div>{{count}}</div>
<div @click='todo2'>
<button @click='todo'>點擊</button>
</div>
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el:'#app',
data:{
count:0
},
methods:{
todo:function(event){
},
todo2:function(event){
console.log(event.target.tagName + " " + event.target.innerHTML);
this.count+=2;
}
}
});
</script>
</body>
</html>
展示效果:
分析:在代碼中,button綁定的todo方法是沒有實現(xiàn)的,理論上是沒有反應(yīng)的,但從展示效果來看,是執(zhí)行了todo2方法,為什么呢?這是因為事件冒泡到了它的父級元素div上,所以才執(zhí)行了todo2方法,這就叫做冒泡,一個從子元素向父元素傳遞事件的行為。那么這種情況顯然不是我們預(yù)想的,那怎么辦呢。阻止冒泡,有2種方式解決:
第一種:原生js
event.stopPropagation();
第二種:vue提供的修飾符
.stop 阻止冒泡
<button @click.stop='todo'>點擊</button>
完整代碼:
<!DOCTYPE html>
<html lang="en">
<body>
<div id="app">
<div>{{count}}</div>
<div @click='todo2'>
<button @click.stop='todo'>點擊</button>
</div>
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el:'#app',
data:{
count:0
},
methods:{
todo:function(event){
console.log('111');
//阻止冒泡
//event.stopPropagation();
},
todo2:function(event){
console.log(event.target.tagName + " " + event.target.innerHTML);
this.count+=2;
}
}
});
</script>
</body>
</html>
展示效果:
.stop 的存在就相當(dāng)于阻止事件向父元素傳遞,保證只執(zhí)行todo
在實際開發(fā)中,有的時候,我們想要改變某些組件原生的動作,比如默認(rèn)情況下,如果我點擊一個<a>標(biāo)簽,那么默認(rèn)會自動跳轉(zhuǎn)到href對應(yīng)的鏈接上去。如果我想要阻止這些原生的動作行為,而是僅僅需要功能完成執(zhí)行我們的function函數(shù)。那么這時候,我們就要使用prevent了,我們來舉一個例子看看:
<!DOCTYPE html>
<html lang="en">
<body>
<div id="app">
<a href="www.baidu.com" @click.prevent="func">百度</a>
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el:"#app",
data: {
count:0
},
methods:{
func:function(){
alert('阻止a標(biāo)簽原先點擊跳轉(zhuǎn)的默認(rèn)行為。')
}
}
});
</script>
</body>
</html>
展示效果:
除了以上經(jīng)常用的2個以外,官網(wǎng)還提供了其它修飾符,有興趣的可以研究下使用場景
5、按鍵修飾符
在以往的頁面交互中,我們常常會遇到這種需求:當(dāng)用戶輸入賬號密碼后點擊 Enter 鍵、一個多選篩選條件通過點擊多選框后自動加載符合選中條件的數(shù)據(jù)等等。在傳統(tǒng)的前端開發(fā)中,當(dāng)我們碰到這種類似的需求時,我們往往需要知道 js 中需要監(jiān)聽的按鍵所對應(yīng)的 keyCode,然后通過判斷 keyCode 得知用戶是按下了那個按鍵,繼而執(zhí)行后續(xù)的操作。例如,在下面的示例中,當(dāng)我們松開 Enter 按鍵后控制臺就會打印出姓名輸入框內(nèi)的值。
<label>姓名:</label>
<input id="name" type="text">
$('#name').on('keyup',function(event){
event.preventDefault();//阻止瀏覽器默認(rèn)動作
if(event.Code == 13){
console.log($(this).val());
}
});
而在 Vue 中,給我們提供了一種便利的方式去實現(xiàn)監(jiān)聽我們的按鍵事件。在監(jiān)聽鍵盤事件時,我們經(jīng)常需要查找常見的按鍵所對應(yīng)的 keyCode,而 Vue 為最常用的按鍵提供了別名。
在下面的代碼中,我們同樣監(jiān)聽了 input 框的 Enter 事件,而我們只需要在綁定的 input 標(biāo)簽的 keyup 事件上添加 .enter 修飾符即可。
<!DOCTYPE html>
<html lang="en">
<body>
<div id="app">
<label>姓名:</label>
<input id="name" type="text" v-model:value="name" @keyup.enter="log">
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: '#app',
data: {
name: ''
},
methods: {
log:function() {
console.log(`name:${this.name}`);
}
}
})
</script>
</body>
</html>
展示效果:
6、自定義按鍵
對于標(biāo)準(zhǔn)的104鍵盤,Vue 不可能幫我們把所有的按鍵鍵值都定義好,這也不現(xiàn)實。于是,Vue 給我們提供了一種通過定義全局 config.keyCodes 來自定義按鍵修飾符的別名的方式。例如,在上面的例子中,我們是通過 Enter 按鍵獲取到輸入的文本框的值,現(xiàn)在,我們的需求變了,需要我們通過 F2 按鍵來獲得文本框的值,這時我們就可以通過自定義按鍵修飾符來實現(xiàn)操作。
<!DOCTYPE html>
<html lang="en">
<body>
<div id="app">
<label>姓名:</label>
<input id="name" type="text" v-model:value="name" @keyup.prevent.f2="logF2">
</div>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript">
//通過 keyCode 自定義按鍵修飾符
Vue.config.keyCodes.f2 = 113
var vm = new Vue({
el: '#app',
data: {
name: ''
},
methods: {
logF2:function() {
console.log(`name:${this.name} --- 通過 F2 按鍵獲得`);
}
}
})
</script>
</body>
</html>
這時,通過enter鍵已經(jīng)不生效了,只有恩f2才能實現(xiàn)功能。
規(guī)則:自定義按鍵修飾符名字是自定義的,但對應(yīng)的值必須是按鍵對應(yīng)event.keyCode值。
上一篇:VUE入門教程(二)之模板語法(指令)
件監(jiān)聽是javascript中的一個重要概念。我將通過how do even turn dock實現(xiàn)事件監(jiān)聽來分享這一技術(shù)。下面分別介紹每種事件的詳細(xì)操作。
·等夜視鼠標(biāo)事件mouse down就是鼠標(biāo)左鍵按下。
·鼠標(biāo)逆時針抬起neck就是點擊一下db,肯尼克就是雙擊事件。
·mose over就是鼠標(biāo)移到元素上,經(jīng)過了核磁觸發(fā)。
·mouse move就是鼠標(biāo)動一下就會出發(fā)。
·mouse out就是鼠標(biāo)移出元素。
·mouse leave就是鼠標(biāo)遠(yuǎn)離開頁面。
·mouse enter是鼠標(biāo)一代元素上。經(jīng)過刺身的指元素抒發(fā) contact the minute。
·鼠標(biāo)右鍵打開菜單,在一個鍵盤世界投檔。
·就是按下鍵盤上某個鍵時觸發(fā),也可以獲取到到底是按的哪個鍵。
·tf就是按下鍵抬起觸發(fā)。
·然后是ui 事件,比如加載事件還有鼠標(biāo)滾動的事件。
·然后是手指事件也叫觸摸事件主要用于移動端用于手機觸摸屏幕。
·踏起時代就是觸發(fā)開始。
·踏起摁的就是觸發(fā)結(jié)束。
·踏起就是在滑動踏起。
·看守就是被系統(tǒng)阻止了滑動世界。比如在觸摸的過程中被彈出的彈出框打斷就會觸發(fā)開啟開鎖世界致表達(dá)世界。
·表達(dá)安居然要添加鳳元素作為監(jiān)聽的對象,表達(dá)事件是用的比較多的。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。