閱讀392 返回首頁    go 阿裏雲 go 技術社區[雲棲]


vue事件處理器

監聽事件

可以用v-on指令監聽DOM事件來觸發一些JavaScript代碼

<div >
    <button v-on:click="counter += 1">增加 1</button>
    <p>這個按鈕被點擊了 {{ counter }} 次。</p>
</div>
<script>
var example1 = new Vue({
    el: '#example-1',
    data: {
        counter: 0
    }
})
</script>

方法事件處理器

許多事件處理的邏輯都很複雜,所以直接把JavaScript代碼寫在v-on指令中是不可行的;因此v-on可以接收一個定義

的方法來調用

<div >
    <button v-on:click="greet">Greet</button>
</div>
<script>
var example2 = new Vue({
    el: '#example-2',
    data: {
        name: 'Vue.js'
    },
    methods: {
        greet: function (event) {
            // `this` 在方法裏指當前 Vue 實例
            alert('Hello ' + this.name + '!')
            // `event` 是原生 DOM 事件
            if (event) {
                alert(event.target.tagName)
            }
        }
    }
})
// 也可以用JavaScript直接調用方法
// example2.greet() // -> 'Hello Vue.js!'
</script>

內聯處理器方法

除了直接綁定到一個方法,也可以用內聯 JavaScript 語句

<div >
    <button v-on:click="say('hi')">Say hi</button>
    <button v-on:click="say('what')">Say what</button>
</div>
<script>
new Vue({
    el: '#example-3',
    methods: {
        say: function (message) {
            alert(message)
        }
    }
})
</script>

有時也需要在內聯語句處理器中訪問原生 DOM 事件。可以用特殊變量 $event 把它傳入方法:

<button v-on:click="warn('Form cannot be submitted yet.', $event)">Submit</button>
<script>
methods: {
    warn: function (message, event) {
        // 現在我們可以訪問原生事件對象
        if (event) event.preventDefault()
            alert(message)
    }
}
</script>

事件修飾符

在事件處理程序中調用event.preventDefault()或event.stopPropagation()是常見的需求;盡管我們可以在

methods中輕鬆實現這點,但更好的方式是:methods隻有純粹的數據邏輯,而不是去處理DOM事件細節

為了解決這個問題,Vue.js為v-on提供了 事件修飾符;通過由點(.)表示的指令後綴來調用修飾符

eg.stop/.prevent/.capture/.self/.once

<!-- 阻止單擊事件冒泡 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重載頁麵 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修飾符可以串聯  -->
<a v-on:click.stop.prevent="doThat"></a>
<!-- 隻有修飾符 -->
<form v-on:submit.prevent></form>
<!-- 添加事件偵聽器時使用事件捕獲模式 -->
<div v-on:click.capture="doThis">...</div>
<!-- 隻當事件在該元素本身(比如不是子元素)觸發時觸發回調 -->
<div v-on:click.self="doThat">...</div>

使用修飾符時順序很重要;相應的代碼會以同樣的順序產生。因此用@click.prevent.self會阻止所有的點擊,而

@click.self.prevent隻會阻止元素上的點擊

<!-- 點擊事件將隻會觸發一次 -->
<a v-on:click.once="doThis"></a>

不像其它隻能對原生的DOM事件起作用的修飾符,.once修飾符還能被用到自定義的組件事件上

鍵值修飾符

在監聽鍵盤事件時,我們經常需要監測常見的鍵值;Vue允許為v-on在監聽鍵盤事件時添加關鍵修飾符:

<!-- 隻有在 keyCode 是 13 時調用 vm.submit() -->
<input v-on:keyup.13="submit">

記住所有的 keyCode 比較困難,所以 Vue 為最常用的按鍵提供了別名:

<!-- 同上 -->
<input v-on:keyup.enter="submit">
<!-- 縮寫語法 -->
<input @keyup.enter="submit">

全部的按鍵別名:.enter/.tab/.delete (捕獲“刪除”和“退格”鍵)/.esc/.space/.up/.down/.left/.right;
可以通過全局config.keyCodes對象自定義鍵值修飾符別名:

// 可以使用 v-on:keyup.f1
Vue.config.keyCodes.f1 = 112

修飾鍵

可以用如下修飾符開啟鼠標或鍵盤事件監聽,使在按鍵按下時發生響應:.ctrl/.alt/.shift/.meta

注意:在Mac係統鍵盤上meta對應命令鍵 (⌘)。在Windows係統鍵盤meta對應windows徽標鍵(⊞)。在Sun操作係統鍵

盤上meta對應實心寶石鍵 (◆)。在其他特定鍵盤上,尤其在MIT和Lisp鍵盤及其後續,比如Knight鍵盤,space-

cadet鍵盤,meta被標記為“META”。在Symbolics鍵盤上,meta被標記為“META”或“Meta”

<!-- Alt + C -->
<input @keyup.alt.67="clear">
<!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>

修飾鍵比正常的按鍵不同;修飾鍵和keyup事件一起用時,事件引發必須按下正常的按鍵。換種說法:如果要引發

keyup.ctrl,必須按下ctrl時釋放其他的按鍵;單單釋放ctrl不會引發事件

滑鼠按鍵修飾符

.left/.right/.middle;這些修飾符會限製處理程序監聽特定的滑鼠按鍵

為什麼在html中監聽事件

你可能注意到這種事件監聽的方式違背了關注點分離(separation of concern)傳統理念。不必擔心,因為所有的Vue.js事件處理方法和表達式都嚴格綁定在當前視圖的ViewModel上,它不會導致任何維護上的困難。實際上,使用v-on有幾個好處:

1.掃一眼HTML模板便能輕鬆定位在JavaScript代碼裏對應的方法

2.你無須在JavaScript裏手動綁定事件,你的ViewModel代碼可以是非常純粹的邏輯,和DOM完全解耦,更易於測試

3.當一個ViewModel被銷毀時,所有的事件處理器都會自動被刪除。你無須擔心如何自己清理它們

最後更新:2017-08-13 22:25:04

  上一篇:go  精確控製器件中最關鍵的傳感器 TE將挑戰應用於4個嚴苛環境
  下一篇:go  雲數據庫HBase版重磅商業化上線