iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0
Modern Web

不用去柬埔寨也能活摘 Vue系列 第 17

[Vue] Day17 事件綁定:v-on

  • 分享至 

  • xImage
  •  

昨天有帶各位了解了 v-bind 的樣式綁定,那今天就與大家進入新的單元吧
前幾天的文章有跟各位介紹許多個 v 開頭的模板指令
而在 Vue 中只有一個是與事件有關的指令,也就是我們今日要介紹的:v-on

v-on (事件綁定)

v-on 在 Vue 中被稱之為事件綁定,用法很簡單
最常見的方式是:v-on:事件名稱="運算式",那我們來舉個例子看看吧:

<template>
  <p>click:{{ click_iThome }}</p>
  <button v-on:click="click_iThome++">ClickButton</button>
</template>
<script>
export default {
  data() {
    return {
      click_iThome: 0,
    };
  },
};
</script>

就像這樣,我們先在網頁中放上一個可以記錄我們點擊次數的 v-model,接著在放在一個可供我們點擊的 button,並在 Button 的標籤中加上 v-on,而事件名稱設定為 click,接者再等號後面的運算式則為我們設定的 v-model 去連加:v-on:click="click_iThome++" ( ++ 的意思為連加),最後到 data 中把初始的點擊次數定義為 0 即可。

讓我們來看看網頁的表現:

除此之外,也可以用 methods 去改寫,也能達到相同效果:

<template>
  <p>click:{{ click_iThome }}</p>
  <button v-on:click="ClickButton">ClickButton</button>
</template>
<script>
export default {
  data() {
    return {
      click_iThome: 0,
    };
  },
  methods: {
    ClickButton() {
      this.click_iThome++;
    },
  },
};
</script>

在 methods 中,我們可以設定一個函式:每點擊一次就 +1,最後再將值透過 v-model 傳至模板
來看看網頁表現:


除了以上的寫法外,與 v-bind 一樣,事件綁定 v-on 也有簡寫:

以 Click 的事件為例,一般寫法為:

<button v-on:click="Clickbtn">Click</button>

簡寫為:

<button @click="Clickbtn">Click</button>

v-on:事件名稱="運算式" 改寫為 @事件名稱="運算式"


接下來要與各位來了解很重要的 event 物件了,注意聽囉!

v-on 的 event 物件

當我們的監聽事件發生時,EventListener 也會同時建立一個「事件物件」,包含了與此事件相關的屬性、方法與觸發事件等等。像是我們常用的 preventDefault()、stopPropagation() 皆是由 event所提供的。而當 v-on 在觸發事件時,如果沒有指定參數的話,預設會將 event 當成參數傳入:

<template>
  <button @click="clickBtn">click Button</button>
</template>
<script>
export default {
  methods: {
    clickBtn(event) {
      console.log(event.target.tagName)
    },
  },
};
</script>

我們讓 button 在觸發點擊事件的時後傳到 methods 中,同時取得預設所傳入的 event 物件。

  • target:表示觸發事件的元素
  • tagName:讀取屬性並調用元素的標籤名稱

解釋完以上名詞後,在來看看此句程式碼:

console.log(event.target.tagName)

讓我們能在觸發點擊事件時記錄下來,並計算這個此事件的發生次數。

來看看網頁及 console 的表現:


v-on 修飾子

與 v-model 一樣,v-on 也有提供給開發者修飾子的功能:

事件通用型

  • stop
  • prevent
  • capture
  • self
  • once
  • passive

以下就讓我們來逐一介紹吧:

stop。

stop 的作用就如同 event.stopPropagation(),用來阻止事件冒泡

  • 事件氣泡:事件發生是從最內層元素開始,逐層往上傳播
    舉個例子,當我們撰寫了一個 Click 觸發事件:
<body>
    <div>
        <p><button @click="clickBtn">Click</button></p>
    </div>
</body>

而觸發事件的順序應該是:

p -> div -> body -> html -> document

冒泡事件從目標元素開始向上冒泡,通常會一直上升到 <html>,再到 document 對象,甚至更可能會到達 window,冒泡事件會調用路徑上所有的處理程序。

  • 停止事件冒泡:當任意處理程序決定事件已被完全處理時,就會停止冒泡。
    例如我們一樣點擊 Button,但 body 中的 @click 並不會觸發:
<body>
  <button @click.stop="clickBtn()">Click</button>
</body>

prevent

prevent 的作用就如同 event.preventDefault(),用來阻擋元素的預設行為。

capture

capture 的作用是可以讓我們將指定事件用捕獲的形式觸發。

self

self 可觸發元素本身的事件行為,但如是由子層元素傳遞來的事件則不會觸發。

once

once 的作用是讓指定的事件只觸發一次。

passive

passive 的作用就如同 addEventListener 的 passive 屬性,讓瀏覽器知道此事件處理器並不會呼叫 event.preventDefault 去停止瀏覽器的預設行為。


上一篇
[Vue] Day16 透過 v-bind 進行 css 樣式綁定
下一篇
[Vue] Day18 條件判斷:v-if 、v-show 與列表渲染:v-for
系列文
不用去柬埔寨也能活摘 Vue30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言