# Vue.js 學習旅程Mile 9 – Event Handling 事件處理篇-1:methods & v-on
###### tags: `w3HexSchool` `Vue` `Javascript`
## methods
在 Vue Instance 中的選項物件屬性中,可設定 `methods` 這個屬性用來定義方法,執行一些動作。
`methods` 屬性中的每個 key 是一個方法的名稱,而 value 就是方法的函數。
我們常使用指令 `v-on` 來綁定 HTML DOM 元素的事件監聽器,以觸發要執行的方法。
範例:
```htmlmixed=
<div id="app">
<button v-on:click="addCount">addCount</button>
<p>{{ count }}</p>
</div>
```
```javascript=
var vm = new Vue({
el: '#app',
data: {
count: 0
},
methods: {
addCount: function() {
this.count += 1;
}
}
});
```
:::danger
方法中的 `this` 會指向 Vue Instance,所以不能使用會將 `this` 指向上層內容的箭頭函式 arrow function 來定義 methods
:::
## v-on
* 縮寫:`@`
* 表達式:Function、Inline Statement、Object
* 參數:event
* 修飾符
* `.stop` : 呼叫 event.stopPropagation(),停止觸發上層 DOM 元素事件
* `.prevent` : 呼叫 event.preventDefault(),避免瀏覽器預設行為
* `.capture` : 不管觸發事件的目標是否是下層, 設定 `capture` 的事件一定會先觸發
* `.self` : 僅觸發自己範圍的事件,不包含子層
* `.{keyCode | keyAlias}` : 只在按下鍵盤任一鍵值才會觸發事件
* `.native` : 監聽元件根元素的原生事件
* `.once` : 此事件只觸發一次
* `.left` : 只在點擊滑鼠左鍵才會觸發事件
* `.right` : 只在點擊滑鼠右鍵才會觸發事件
* `.middle` : 只在點擊滑鼠中鍵才會觸發事件
* `.passive` : 以 { passive : true } 的模式添加事件監聽器,無視 prevent 功能
* 用法:綁定事件監聽器。事件類型由參數指定。表達式可以是一個方法的名字或一個行內陳述式,如果沒有修飾符也可以省略。
關於修飾符的詳細用法,會在之後的篇章有完整介紹。
接下來針對 `v-on` 的表達方式用法做介紹:
### 使用表達式 Expression
* 表達式 ( Expression ):又可稱為表示式、運算式,經常透過一些符號結合上下語句並運算及回傳結果。
* 陳述式 ( Statement ):用於命令執行指定的一系列操作,不會回傳結果。
```htmlmixed=
<div id="app">
<button @click="count += 1">點我+1</button>
<p>{{ count }}</p>
</div>
```
```javascript=
var vm = new Vue({
el: '#app',
data: {
count: 0
}
});
```
### 使用事件名稱 Method Name
當使用事件名稱綁定時,方法中的第一個參數會是原生的 DOM 事件物件,所以可以使用這個物件來操作叫用此事件的元素
```htmlmixed=
<div id="app">
<div>
<button @click="aPlus1AndbMinus">a+ and b-</button>
{{a}}:{{b}}
</div>
</div>
```
```javascript=
var vm = new Vue({
el: '#app',
data: {
a: 1,
b: 10
},
methods: {
aPlus1AndbMinus: function(event) {
this.a += 1;
this.b -= 1;
console.log(`You clicked ${event.target.tagName}`);
}
}
});
```
### 使用行內陳述式 Inline Statement
方法內可以傳入參數,而當需要原生的 DOM 事件物件時,可以用 `$event` 變數當作參數傳入方法中使用。
```htmlmixed=
<div id="app">
<div>
<button @click="clickWhat('hi', $event)">hi</button>
<button @click="clickWhat('yo', $event)">yo</button>
You click {{what}} {{tag}}
</div>
</div>
```
```javascript=
var vm = new Vue({
el: '#app',
data: {
what: '',
tag: '',
},
methods: {
clickWhat: function(what, event) {
this.what = what;
this.tag = event.target.tagName;
}
}
});
```
### 使用物件 Object { key : value }
* key : 欲綁定的事件名稱
* value : 觸發事件時想要叫用的方法名稱
:::warning
物件的設定方式不能使用縮寫 @ 和任何的修飾符
:::
```htmlmixed=
<div id="app">
<div>
<button v-on="{ mousedown: showDown, mouseup: showUp }">click me</button>
{{doWhat}}
</div>
</div>
```
```javascript=
var vm = new Vue({
el: '#app',
data: {
doWhat: ''
},
methods: {
showUp: function(event) {
this.doWhat = `up ${event.target.tagName}`;
},
showDown: function(event) {
this.doWhat = `down ${event.target.tagName}`;
}
}
});
```
### 只使用修飾符 Modifiers
```htmlmixed=
<form @submit.prevent>
<button type="submit">submit</button>
</form>
```
在沒有 `@submit.prevent` 的情況下,頁面會閃一下,這時頁面已送出表單並重新載入了,而加上 `@submit.prevent` 後畫面不會重新載入
## 參考資料
* [Vue.js - methods](https://vuejs.org/v2/api/#methods)
* [Vue.js - Event Handling](https://vuejs.org/v2/guide/events.html)
* [Vue.js - v-on](https://cn.vuejs.org/v2/api/index.html#v-on)
* [Vue.js Core 30天屠龍記(第16天): 事件處理](https://ithelp.ithome.com.tw/articles/10206798)
* [Day10 - [Directives] 事件處理(Event Handling)](https://ithelp.ithome.com.tw/articles/10194631)
* [用範例理解 Vue.js #12:Event Handling(v-on)](https://ithelp.ithome.com.tw/articles/10192961)
* [Vue.js: Methods 與事件處理 (Event Handling)](https://cythilya.github.io/2017/04/17/vue-methods-and-event-handling/)
* [【JavaScript 核心】陳述式與表達式](https://ithelp.ithome.com.tw/articles/10214107)