 
  事件綁定
事件是 JavaScript 操作網頁最重要的部分。在 Vue 主要是透過 v-on 指令來對需要監聽的 DOM 進行事件綁定,因為比較常用到,可以使用「@」來縮寫。
|  |  | 
- event:事件名稱。
- expression:表達式,預期值為。- Inline Statement
- Function
- Object
 
1. 行內敍述
範例,一個按鈕綁定 click:
|  |  | 
|  |  | 
2. 綁定事件處理函式
行內敍述只能用於簡單事件處理,因為你不可能將所有邏輯複雜的程式碼都寫在 v-on 指令中,或者遇到需要重複執行的情況。因此可以將事件處理函式用 method 宣告,並透過 v-on 綁定。
|  |  | 
|  |  | 
3. 傳遞參數
如果要在事件中傳遞參數,可以在行內敍述中直接呼叫事件處理函式:
|  |  | 
|  |  | 
4. 綁定多個事件
綁定多個事件,可以重複使用 v-on 指令:
|  |  | 
|  |  | 
或是使用物件綁定事件的方式:
|  |  | 
使用物件綁定事件的方式,有以下幾點要注意:
- 指令沒參數,不能使用簡寫 @;
- 也無法使用修飾符號;
- 函式無法傳參數。
CodePen Demo:Vue2.x - v-on 物件綁定事件
4. 事件物件
如果要獲取 event 物件,可以使用特殊變數 $event:
|  |  | 
使用 v-on 綁定方法,預設會傳入一個參數 event 事件物件:
|  |  | 
|  |  | 
但是,直接呼叫事件處理函式,要訪問 event 物件,要自己將 $event 傳入:
|  |  | 
|  |  | 
事件行為修飾符號
1. 通用修飾符號
- .stop:呼叫- event.stopPropagation(),停止事件的繼續傳遞。
- .prevent:呼叫- event.preventDefault(),停止事件預設行為。
- .self:只有當事件是從監聽器所綁定的元素本身(非子元素)才呼叫事件處理函式,簡單來說就是事件處於目標階段才會呼叫事件處理函式。
- .capture:事件監聽器使用補獲模式。
- .once:該事件處理函式指被呼叫一次(還能被用到自定義的元件事件上)。
- .passive:與- .prevent剛好相反,表示事件處理函式永遠不會呼叫- preventDefault()(所以別與- .prevent共用)。
- .native:監聽根元素的原生事件(在元件上使用- v-on只會監聽自定義事件,如果要監聽監聽根元素的原生事件時,就可以使用)。
使用 .stop 等同:
|  |  | 
.capture、.once、.passive 分別對應到 addEventListener() 的 options 選項參數。.native 會在元件用到。
舉例來說,v-on:click.prevent.self 會阻止所有的點擊,而 v-on:click.self.prevent 只會阻止對元素自身的點擊。
2. 鍵盤事件修飾符號
鍵盤事件 kepdown 與 keyup 可以使用鍵盤事件修飾符號。
原本需要使用鍵盤事件的 key 屬性來判斷是否按下 Enter 鍵來執行處理函式:
|  |  | 
現在只需要使用修飾符號:
|  |  | 
原則上,所有 key 值 都有對應的修飾符號,若遇到 PageDown 這類名稱,需轉成 kebab-case 來使用:
|  |  | 
2.1 keyCode
keyCode 屬性用法已經被廢棄了,雖然目前因為舊程式碼仍保留支援,但為了未來瀏覽器,盡可能不使用它。
使用 keyCode 修飾符號:
|  |  | 
為了在必要的情況下支持舊瀏覽器,Vue 提供了絕大多數常用的按鍵別名:
- .enterEnter 鍵
- .tabTab 鍵
- .delete(包含 Backspace 鍵、Delete 鍵)
- .escESC 鍵
- .space空白鍵
- .up方向鍵上
- .down方向鍵下
- .left方向鍵左
- .right方向鍵右
舉例來說,IE9 上面的某些按鍵 key 值會跟別人不同,因此使用上面按鍵的別名會是首要選擇。
另外可透過全域 config.keyCodes 物件,自定義按鍵修飾符號別名。
3. 系統鍵修飾符號
系統鍵修飾符號不只鍵盤事件能用,包含了滑鼠事件:
- .ctrl(MAC 沒有)
- .alt
- .shift
- .meta(MAC 的 command 鍵- ⌘,Windows 則對應到 win 鍵- ⊞)
|  |  | 
keyup 事件一起使用時,系統鍵修飾符號必須處於按下狀態。也就是說,只有按住系統鍵修飾符號情況下釋放其他按鍵才能觸發。若想要單獨使用系統鍵和 keyup 事件,請改用 keyCode 對應的修飾符號,以 keyup.ctrl 來說,就是改用 keyup.17。
3.1 精確判斷
.exact 修飾符號允許你控制由精確的系統修飾符號組合觸發的事件。
|  |  | 
4. 滑鼠按鍵修飾符號:
- .left:只當點擊滑鼠左鍵時觸發。
- .right:只當點擊滑鼠右鍵時觸發。
- .middle:只當點擊滑鼠中鍵時觸發。
右鍵會跳出選單,可以搭配 .prevent 修飾符號。
視窗監聽
若是要監聽 window 物件,就沒辦法使用 v-on 指令了。
這時事件監聽就需要用到生命週期 mounted、beforeDestroy 鉤子。
在 mounted 鉤子上進行監聽:
|  |  | 
但是這樣子的作法,若生命週期結束實體銷毀時,它並不會自動移除事件監聽,因此需要在 beforeDestroy 鉤子手動移除監聽:
|  |  | 
事件委派
事件委派(Event Delegation) 或稱 事件委託、事件代理,是一種減少事件監聽的優化方式。利用了事件冒泡,將事件綁定在父元素上,再判斷當前觸發事件的元素是否是我們要的元素。
那麼在 Vue 中,使用 v-for 時,每個元素綁定事件時,是否有需要使用 事件委派 呢?
直接說結論:
- 原則上沒必要使用,因為效能影響極小;
- 除非要渲染數千甚至上萬的元素,才會嘗試使用事件委派。
