Vue.js 學習旅程Mile 9 – Event Handling 事件處理篇-1:methods & v-on


Posted by yuhantaiwan on 2020-04-26

methods

在 Vue Instance 中的選項物件屬性中,可設定 methods 這個屬性用來定義方法,執行一些動作。

methods 屬性中的每個 key 是一個方法的名稱,而 value 就是方法的函數。

我們常使用指令 v-on 來綁定 HTML DOM 元素的事件監聽器,以觸發要執行的方法。

範例:

<div id="app">
  <button v-on:click="addCount">addCount</button>
  <p>{{ count }}</p>
</div>
var vm = new Vue({
  el: '#app',
  data: {
    count: 0
  },
  methods: {
    addCount: function() {
      this.count += 1;
    }
  }
});

方法中的 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 ):用於命令執行指定的一系列操作,不會回傳結果。
<div id="app">
  <button @click="count += 1">點我+1</button>
  <p>{{ count }}</p>
</div>
var vm = new Vue({
  el: '#app',
  data: {
    count: 0
  }
});

使用事件名稱 Method Name

當使用事件名稱綁定時,方法中的第一個參數會是原生的 DOM 事件物件,所以可以使用這個物件來操作叫用此事件的元素

<div id="app">
  <div>
    <button @click="aPlus1AndbMinus">a+ and b-</button>
    {{a}}:{{b}}
  </div>
</div>
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 變數當作參數傳入方法中使用。

<div id="app">
  <div>
    <button @click="clickWhat('hi', $event)">hi</button>
    <button @click="clickWhat('yo', $event)">yo</button>
    You click {{what}} {{tag}}
  </div>
</div>
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 : 觸發事件時想要叫用的方法名稱

物件的設定方式不能使用縮寫 @ 和任何的修飾符

<div id="app">
  <div>
    <button v-on="{ mousedown: showDown, mouseup: showUp }">click me</button>
    {{doWhat}}
  </div>
</div>
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

<form @submit.prevent>
  <button type="submit">submit</button>
</form>

在沒有 @submit.prevent 的情況下,頁面會閃一下,這時頁面已送出表單並重新載入了,而加上 @submit.prevent 後畫面不會重新載入

參考資料


#w3HexSchool #Vue #javascript







Related Posts

[Day 06] - Vault Built-in help and Auth

[Day 06] - Vault Built-in help and Auth

【Day02】用pytube測試下載 Youtube 影片

【Day02】用pytube測試下載 Youtube 影片

關於 React 小書:前端應用狀態管理—狀態提升

關於 React 小書:前端應用狀態管理—狀態提升


Comments