EP9 - 事件處理

更新於 2024/09/17閱讀時間約 1 分鐘
Event Handling 處理使用者觸發了哪些動作,
好奇這能什麼新功能?不就是綁定事件處理而已嗎?
繼續看下去~~

聆聽事件​ - Listening to Events

我們可以使用v-on 指令來監聽 DOM 事件並在事件觸發時運行一些 JavaScript 程式碼,通常我們會將其縮寫為 @ 符號。用法可以是 v-on:click="handler" 或者使用簡寫 @click="handler"

handler 值可以是以下之一:

內聯處理程序(inline handler):當事件觸發時要執行的inline JavaScript(類似於原生的 onclick 屬性)。

方法處理程序(method handler):指向在組件上定義的方法的屬性名稱或路徑

內聯處理程序 - Inline Handlers​

內聯處理程序通常用於簡單的情況,例如:

const count = ref(0)
<button @click="count++">Add 1</button>
<p>Count is: {{ count }}</p>

Try it in the playground

方法處理程序 - Method Handler

許多事件處理程序的邏輯會更複雜,因此不適合使用內聯處理程序。這就是為什麼 v-on 也可以接受要調用的組件方法的名稱或路徑。

const name = ref('Vue.js')

function greet(event) {
alert(`Hello ${name.value}!`)
// `event` 是原生的 DOM 事件
if (event) {
alert(event.target.tagName)
}
}
<!-- `greet` 是上面定義的方法的名稱 -->
<button @click="greet">Greet</button>

Try it in the playground

方法處理程序會自動接收觸發它的原生 DOM 事件對象——在上面的例子中,我們能夠通過 event.target 訪問分派事件的元素。

參見:Typing Event Handlers

方法處理與內聯處理的偵測 - Method vs. Inline Detection

範本編譯器會透過檢查 v-on 的值字串是否為有效的 JavaScript 識別符號或屬性存取路徑來檢測方法處理程序。 例如,foofoo.barfoo['bar'] 會被視為方法處理程序,而 foo()count++ 則會被視為內聯處理程序。

在內聯處理器中調用方法 - Calling Methods in Inline Handlers​

除了直接綁定到方法名稱之外,我們還可以在內聯處理器中調用方法。這使我們能夠傳遞自定義參數到方法中,而不是傳遞原生事件:

function say(message) {
alert(message)
}
<button @click="say('hello')">Say hello</button>
<button @click="say('bye')">Say bye</button>

Try it in the playground

在內聯處理程序中訪問事件參數 - Accessing Event Argument in Inline Handlers​

有時候我們需要在內聯處理程序中訪問原始的 DOM 事件。我們可以使用特殊變量 $event 或內聯箭頭函數來傳遞事件:

<!-- 使用 $event 特殊變量 -->
<button @click="warn('Form cannot be submitted yet.', $event)">
Submit
</button>

<!-- 使用內聯箭頭函數 -->
<button @click="(event) => warn('Form cannot be submitted yet.', event)">
Submit
</button>
function warn(message, event) {
// 現在我們可以訪問原生事件
if (event) {
// 阻止事件的預設行為
event.preventDefault()
}
alert(message)
}

Q:什麼是預設行為?

在網頁開發中,預設行為(Default Behavior)是指瀏覽器在特定事件發生時,會自動執行的一些內建操作。例如:

  1. 表單提交
    • 當你在表單中點擊提交按鈕時,瀏覽器會自動提交表單數據,並重新加載頁面或導航到指定的目標URL。
  2. 超連結點擊
    • 當你點擊超連結(<a> 標籤)時,瀏覽器會自動導航到連結指定的URL。
  3. 文本框輸入
    • 當你在文本框中按下 Enter 鍵時,瀏覽器會自動提交包含該文本框的表單。
  4. 按鈕點擊
    • 當你點擊按鈕時,瀏覽器可能會提交包含該按鈕的表單(如果該按鈕是提交按鈕)。

在 JavaScript 中,你可以使用 event.preventDefault() 來阻止這些預設行為。這樣可以讓你完全控制事件發生後的行為。例如:

  • 阻止表單提交:你可以在表單提交按鈕的點擊事件中使用 event.preventDefault(),然後執行一些自定義的驗證邏輯,如果驗證通過再手動提交表單。
  • 自定義超連結行為:你可以在超連結的點擊事件中使用 event.preventDefault(),然後執行一些自定義的導航邏輯或動畫效果。

以下是一些示例:

阻止表單提交

<form id="myForm">
<input type="text" name="username" />
<button type="submit">提交</button>
</form>

<script>
document.getElementById('myForm').addEventListener('submit', function(event) {
event.preventDefault(); // 阻止表單提交的預設行為
alert('表單尚未提交。');
// 你可以在這裡添加自定義的表單處理邏輯
});
</script>

阻止超連結導航

<a href="https://example.com" id="myLink">點擊我</a>

<script>
document.getElementById('myLink').addEventListener('click', function(event) {
event.preventDefault(); // 阻止超連結導航的預設行為
alert('超連結尚未導航。');
// 你可以在這裡添加自定義的導航邏輯
});
</script>

通過這些方法,可以在事件發生時完全控制應用的行為,而不是依賴瀏覽器預設行為。

事件修飾符 - Event Modifiers

在事件處理程序中,通常需要調用 event.preventDefault()event.stopPropagation()。雖然我們可以在方法內輕鬆地執行這些操作,但如果方法僅處理數據邏輯,而不是處理 DOM 事件細節,那會更好。

為了解決這個問題,Vue 提供了事件修飾符,用於 v-on 指令。修飾符是指令的後綴,用點表示。

  • .stop:停止事件的傳播。
  • .prevent:取消事件的預設行為。
  • .self:僅在事件目標為當前元素時觸發處理程序,即事件不是來自子元素。
  • .capture:以捕獲模式添加事件監聽器,即內部元素的事件會先被處理。
  • .once:事件處理程序只觸發一次。
  • .passive:不阻止事件的預設行為,常用於移動設備的觸控事件以提高性能。
<!-- 停止 click 事件的傳播 -->
<a @click.stop="doThis"></a>

<!-- 取消 submit 事件的預設行為,避免重新加載頁面 -->
<form @submit.prevent="onSubmit"></form>

<!-- 修飾符可以鏈接使用 -->
<a @click.stop.prevent="doThat"></a>

<!-- 僅使用修飾符 -->
<form @submit.prevent></form>

<!-- 只在事件目標是該元素時才觸發處理程序 -->
<div @click.self="doThat">...</div>

提示:

  • 使用修飾符的順序很重要,因為相關代碼會按相同順序生成。例如,@click.prevent.self 會阻止元素及其子元素的 click 預設行為,而 @click.self.prevent 只會阻止元素本身的 click 預設行為。

.capture.once.passive 修飾符對應於原生 addEventListener 方法的選項:

<!-- 使用捕獲模式來添加事件監聽器 -->
<!-- 例如:即事件觸發的內部元素會先在這裡處理 -->
<!-- 然後再由該元素處理 -->
<div @click.capture="doThis">...</div>

<!-- 點擊事件最多只會觸發一次 -->
<a @click.once="doThis"></a>

<!-- 滾動事件的預設行為(滾動)會立即發生 -->
<!-- 而不是等 `onScroll` 完成後再發生 -->
<!-- 如果 `onScroll` 包含 `event.preventDefault()` -->
<div @scroll.passive="onScroll">...</div>

.passive 修飾符通常與觸控事件監聽器一起使用,以提高移動設備上的性能

提示:

不要將 .passive.prevent 一起使用,因為 .passive 已經告訴瀏覽器你不打算阻止事件的預設行為,如果這樣做,瀏覽器可能會顯示警告。

鍵盤修飾符 - Key Modifiers

當監聽鍵盤事件時,我們經常需要檢查特定的鍵。Vue 允許在監聽鍵盤事件時為 v-on@ 添加鍵盤修飾符:

<!-- 只有當 `key``Enter` 時才會調用 `submit` -->
<input @keyup.enter="submit" />

你可以直接使用任何有效的鍵名,這些鍵名是由 KeyboardEvent.key 提供的,將它們轉換為 kebab-case(連字符小寫命名)作為修飾符。

<input @keyup.page-down="onPageDown" />

在上面的例子中,當 $event.key 等於 'PageDown' 時,處理程序才會被調用。

鍵名別名 - Key Aliases​Vue 為最常用的鍵提供了別名:

  • .enter
  • .tab
  • .delete(涵蓋 "Delete" 和 "Backspace" 鍵)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right

系統修飾鍵 - System Modifier Keys​

使用以下修飾符來觸發只有在按下相應的修飾鍵時才會觸發的滑鼠或鍵盤事件監聽器:

  • .ctrl
  • .alt
  • .shift
  • .meta

提示:

在 Macintosh 鍵盤上,meta 是命令鍵 (⌘)。在 Windows 鍵盤上,meta 是 Windows 鍵 (⊞)。在 Sun Microsystems 鍵盤上,meta 標記為實心菱形 (◆)。在某些鍵盤上,特別是 MIT 和 Lisp 機器鍵盤及其後繼產品,如 Knight 鍵盤、space-cadet 鍵盤,meta 標記為“META”。在 Symbolics 鍵盤上,meta 標記為“META”或“Meta”。

<!-- Alt + Enter -->
<input @keyup.alt.enter="clear" />

<!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>

提示:

請注意,修飾鍵不同於普通鍵,當與 keyup 事件一起使用時,必須在事件發出時按下修飾鍵。換句話說,keyup.ctrl 只有在您按住 ctrl 鍵的同時放開另一個鍵時才會觸發。如果您單獨放開 ctrl 鍵,則不會觸發。

.exact 修飾符 - .exact Modifier​

.exact 修飾符用來控制觸發事件所需的系統修飾鍵(如 Ctrl、Alt、Shift、Meta)必須完全符合特定的組合。這意味著你可以指定只有在完全按下某些修飾鍵,且不按其他修飾鍵的情況下,事件才會觸發。

1. 只要 Ctrl 鍵按下即可觸發事件(不考慮其他修飾鍵)

<button @click.ctrl="onClick">A</button>

在這個例子中,只要 Ctrl 鍵被按下,不管是否同時按下其他修飾鍵(如 Alt 或 Shift),onClick 函數都會被觸發。

2. 只有在 Ctrl 鍵按下且沒有其他修飾鍵時才會觸發事件

<button @click.ctrl.exact="onCtrlClick">A</button>

在這個例子中,onCtrlClick 函數只會在 Ctrl 鍵按下的同時,其他修飾鍵(如 Alt、Shift)沒有被按下的情況下觸發。如果同時按下其他修飾鍵,事件將不會被觸發。

3. 當沒有按下任何系統修飾鍵時觸發事件

<button @click.exact="onClick">A</button>

這個例子中,onClick 函數只有在沒有按下任何系統修飾鍵的情況下才會被觸發。如果同時按下了 Ctrl、Alt、Shift 或 Meta 鍵,事件將不會觸發。

鼠標按鈕修飾符​ - Mouse Button Modifiers

  • .left
  • .right
  • .middle

這些修飾符限制事件處理器僅響應由特定鼠標按鈕觸發的事件。

這一篇就覺得蠻好用!假如是傳統的寫法要設定一堆事件很麻煩~
現在有很方便的修飾符可以簡化很多內容~
還是要好好測試一下~省下多少麻煩www





avatar-img
2會員
71內容數
分享生活趣事~
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
卡關的人生 的其他內容
v-for 用於渲染陣列或物件列表,支持索引和嵌套。使用 key 來提高渲染效率。v-if 和 v-for 不應同時在同一節點上使用。
Conditional Rendering 根據條件決定是否渲染元素。Vue.js 的 v-if 在條件為真時渲染,v-else-if 處理額外條件,v-show 始終渲染元素但用 CSS 控制顯示。v-if 會創建或銷毀元素,v-show 只改變顯示樣式。
這篇文章介紹了在 Vue.js 前端框架中如何有效地綁定 Class 和 Style。透過使用 v-bind 指令,使用者可以動態地切換元素的類別和內聯樣式,這不僅能夠簡化程式碼,還能防止錯誤的發生。文章中探討了物件和陣列綁定的使用情境,以及如何在組件中應用這些技術,從而提升開發效率與程式的可讀性。
本文介紹了計算屬性(Computed Properties)的基本概念及其在前端框架中的應用,特別是 Vue.js。計算屬性允許我們根據其他響應式數據進行計算並且自動跟蹤依賴,避免不必要的重複計算。本文還探討瞭如何使用可寫入的計算屬性,以及最佳實踐建議,以確保性能與代碼的可讀性。
本文深入探討 Vue.js 中的響應式原理,特別是 Composition API 中的 ref() 和 reactive() 使用。通過示例分析這些概念,並比較二者的優缺點,幫助開發者更清晰地理解響應式狀態的管理與最佳實踐。瞭解如何有效地聲明和管理響應式狀態,對於提升 Vue 開發的效率至關重要。
本文介紹了 Vue 的模板語法及虛擬 DOM 概念。學習如何使用 Vue 進行聲明式渲染,以及模板如何轉換為高效的 JavaScript 代碼。探討各種綁定方法、指令及安全注意事項,幫助開發者構建高效動態用戶界面並提升應用性能。文章深入淺出,適合想進一步瞭解 Vue 的開發者。
v-for 用於渲染陣列或物件列表,支持索引和嵌套。使用 key 來提高渲染效率。v-if 和 v-for 不應同時在同一節點上使用。
Conditional Rendering 根據條件決定是否渲染元素。Vue.js 的 v-if 在條件為真時渲染,v-else-if 處理額外條件,v-show 始終渲染元素但用 CSS 控制顯示。v-if 會創建或銷毀元素,v-show 只改變顯示樣式。
這篇文章介紹了在 Vue.js 前端框架中如何有效地綁定 Class 和 Style。透過使用 v-bind 指令,使用者可以動態地切換元素的類別和內聯樣式,這不僅能夠簡化程式碼,還能防止錯誤的發生。文章中探討了物件和陣列綁定的使用情境,以及如何在組件中應用這些技術,從而提升開發效率與程式的可讀性。
本文介紹了計算屬性(Computed Properties)的基本概念及其在前端框架中的應用,特別是 Vue.js。計算屬性允許我們根據其他響應式數據進行計算並且自動跟蹤依賴,避免不必要的重複計算。本文還探討瞭如何使用可寫入的計算屬性,以及最佳實踐建議,以確保性能與代碼的可讀性。
本文深入探討 Vue.js 中的響應式原理,特別是 Composition API 中的 ref() 和 reactive() 使用。通過示例分析這些概念,並比較二者的優缺點,幫助開發者更清晰地理解響應式狀態的管理與最佳實踐。瞭解如何有效地聲明和管理響應式狀態,對於提升 Vue 開發的效率至關重要。
本文介紹了 Vue 的模板語法及虛擬 DOM 概念。學習如何使用 Vue 進行聲明式渲染,以及模板如何轉換為高效的 JavaScript 代碼。探討各種綁定方法、指令及安全注意事項,幫助開發者構建高效動態用戶界面並提升應用性能。文章深入淺出,適合想進一步瞭解 Vue 的開發者。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
Quasar Dialog 的 Invoking custom component 很好用,但是有些困擾的地方,一起來看看有甚麼辦法吧。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
前言 從零開始構建一個 DateTimePicker 可能看起來令人畏懼,但試想一下你將獲得的靈活性和控制力。在這個系列中,我們將逐步揭開構建過程的神秘面紗,讓您能夠創建一個完全符合需求的自定義 DateTimePicker。 本文章,屬於付費系列的文章,這篇文章,我會希望讀者可以得到的
Thumbnail
本章節的目的是介紹在TypeScript中如何進行例外處理。涵蓋了例外處理的重要性、語法、常見異常類型以及如何主動觸發異常訊息及用戶自定義異常訊息。為讀者提供了全面而深入的了解,以提高程式的可靠性、提供更好的反饋、增加程式的容錯性以及改善程式的可讀性。
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
我們在實作中,難免會遇到在不同組件中,卻有需求相同的資料格式,因此 mixins 可以達到我們的需求,除了 data 以外也包含了 methods 可以共用,舉例來說,學生資料可能會在,班級跟社團內被使用,當我們要撰寫元件時,就可以省略多餘的 data 定義。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
Quasar Dialog 的 Invoking custom component 很好用,但是有些困擾的地方,一起來看看有甚麼辦法吧。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
前言 從零開始構建一個 DateTimePicker 可能看起來令人畏懼,但試想一下你將獲得的靈活性和控制力。在這個系列中,我們將逐步揭開構建過程的神秘面紗,讓您能夠創建一個完全符合需求的自定義 DateTimePicker。 本文章,屬於付費系列的文章,這篇文章,我會希望讀者可以得到的
Thumbnail
本章節的目的是介紹在TypeScript中如何進行例外處理。涵蓋了例外處理的重要性、語法、常見異常類型以及如何主動觸發異常訊息及用戶自定義異常訊息。為讀者提供了全面而深入的了解,以提高程式的可靠性、提供更好的反饋、增加程式的容錯性以及改善程式的可讀性。
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
我們在實作中,難免會遇到在不同組件中,卻有需求相同的資料格式,因此 mixins 可以達到我們的需求,除了 data 以外也包含了 methods 可以共用,舉例來說,學生資料可能會在,班級跟社團內被使用,當我們要撰寫元件時,就可以省略多餘的 data 定義。