Vue?事件處理函數(shù)的綁定示例詳解
正文
在 JS 中「事件」是不需要綁定的,瀏覽器自帶了許多的事件,每個(gè)事件都可以去綁定「處理器(處理函數(shù))」。
事件 ==> 用戶行為 ==> 觸發(fā)瀏覽器的事件 ==> 執(zhí)行對(duì)應(yīng)的事件處理函數(shù)
我們通常通過(guò)addEventListenet
方法去給事件綁定處理函數(shù):
document.addEventListenet("click", function () { // do... }, flase);
需要注意的是addEventListenet
只是「綁定」事件處理函數(shù)并不是「執(zhí)行」!處理函數(shù)只會(huì)在對(duì)應(yīng)事件觸發(fā)的時(shí)候才會(huì)進(jìn)行執(zhí)行。
某些情況下,我們需要把處理函數(shù)獨(dú)立出去,并且需要更改this
的執(zhí)行,這是因?yàn)槭录幚砗瘮?shù)的this
指向元素本身,也就意味著我們不能使用.call
來(lái)更改this
的指向,因?yàn)?code>.call方法會(huì)立即執(zhí)行函數(shù)!
// 這會(huì)導(dǎo)致 test 立即執(zhí)行! document.addEventListenet("click", test.call(this), flase);
// 可以利用 .bind 方法放心的去指向 this,因?yàn)?bind 不會(huì)立即執(zhí)行 document.addEventListenet("click", test.bind(this), flase);
Vue 的事件處理綁定
來(lái)到Vue
,Vue
提供了v-on
指令讓開(kāi)發(fā)者對(duì)元素綁定事件處理函數(shù),例如:
<div v-on:click="methodName"></div> <!-- 或者使用 @click 對(duì) v-on 進(jìn)行簡(jiǎn)寫(xiě) --> <div @click="handler"></div>
v-on
的值可以是JS
表達(dá)式:
<button @click="count += 1">Add</button>
不推薦這樣做,應(yīng)該把邏輯放到methods
里面處理。
v-on
的值還可以是一個(gè)方法事件處理器:
<button @click="onClickAdd">Add</button>
@click
接受一個(gè)方法名或?qū)δ硞€(gè)方法的調(diào)用。
當(dāng)通過(guò)方法名去綁定事件處理函數(shù)的時(shí)候,我們可以給方法傳遞參數(shù):
<div> <h1>{{ count }}</h1> <button @click="onClickAdd(2)">Add</button> <button @click="onClickMinus(2, $event)">Minus</button> </div>
以上代碼,button
在綁定了onClickAdd
和onClickMinus
處理函數(shù)后不會(huì)立即執(zhí)行,而是當(dāng)事件觸發(fā)后才執(zhí)行,這會(huì)開(kāi)頭我們說(shuō)的addEventListenet
是一樣的!
而onClickAdd
和onClickMinus
的括號(hào)是為了方便我們傳遞想要參數(shù)方便在methdos
里進(jìn)行處理。
這里有一個(gè)特殊的參數(shù)$event
,該屬性是Vue
內(nèi)部封裝的一個(gè)屬性,表示觸發(fā)事件的事件對(duì)象。
const app = { template: `<button @click="onClickMinus(2, $event)">Minus</button>`, data(){ return { count: 0 } } methods:{ onClickMinus(num, e){ console.log(e); this.count += num; } } }
v-on
指令還可以同時(shí)綁定多個(gè)事件處理函數(shù),例如:
<div> <h1>{{ count }}</h1> <button @click="onClickAdd(),setLog()">Add</button> <button @click="onClickMinus">Minus</button> </div>
只要在兩個(gè)方法的中間用,
分隔就可以同時(shí)綁定兩個(gè)事件處理函數(shù)啦。
事件修飾符
我們?cè)谔幚硎录r(shí)可能會(huì)調(diào)用event.preventDefault()
或event.stopPropagation()
是很常見(jiàn)的。Vue
提供了一套「修飾符」來(lái)幫助我們完成這些事件,這么做的目的是讓開(kāi)發(fā)者更專注于數(shù)據(jù)邏輯而不用去處理DOM
事件的細(xì)節(jié)。
修飾符是用 . 表示的指令后綴,包含以下這些:
.stop
:阻止事件冒泡。.prevent
:阻止事件的默認(rèn)行為。.self
:當(dāng)event.target
是元素本身時(shí)才會(huì)觸發(fā)事件處理器 。.capture
:采用事件捕獲。.once
:事件調(diào)用一次后,自動(dòng)移除監(jiān)聽(tīng)器。.passive
:修飾符一般用于觸摸事件的監(jiān)聽(tīng)器,可以用來(lái)改善移動(dòng)端設(shè)備的滾屏性能。
?? 注意
不能同時(shí)使用.passive
和.prevent
,因?yàn)?code>.passive已經(jīng)向?yàn)g覽器表明了你不想阻止事件的默認(rèn)行為。
如果你這么做了,則.prevent
會(huì)被忽略,并且瀏覽器會(huì)拋出警告。
<!-- 單擊事件將停止傳遞 --> <a @click.stop="doThis"></a> <!-- 提交事件將不再重新加載頁(yè)面 --> <form @submit.prevent="onSubmit"></form> <!-- 修飾語(yǔ)可以使用鏈?zhǔn)綍?shū)寫(xiě) --> <a @click.stop.prevent="doThat"></a> <!-- 也可以只有修飾符 --> <form @submit.prevent></form> <!-- 僅當(dāng) event.target 是元素本身時(shí)才會(huì)觸發(fā)事件處理器 --> <!-- 例如:事件處理器不來(lái)自子元素 --> <div @click.self="doThat">...</div>
使用修飾符時(shí)需要注意調(diào)用順序,因?yàn)橄嚓P(guān)代碼是以相同的順序生成的。因此使用@click.prevent.self
會(huì)阻止元素及其子元素的所有點(diǎn)擊事件的默認(rèn)行為,而@click.self.prevent
則只會(huì)阻止對(duì)元素本身的點(diǎn)擊事件的默認(rèn)行為。
按鍵修飾符
我們通過(guò)可能還需要通過(guò)event.keycode
來(lái)判斷用戶觸發(fā)的按鍵,Vue
允許在v-on
或@
監(jiān)聽(tīng)按鍵事件時(shí)添加按鍵修飾符,例如:
<!-- 僅在 `key` 為 `Enter` 時(shí)調(diào)用 `submit` --> <input @keyup.enter="submit" />
你可以直接使用KeyboardEvent.key
暴露的按鍵名稱作為修飾符,但需要轉(zhuǎn)為 kebab-case 形式。
<input @keyup.page-down="onPageDown" />
Vue
為一些常用的按鍵提供了別名:
.enter
.tab
.delete
(捕獲“Delete
”和“Backspace
”兩個(gè)按鍵).esc
.space
.up
.down
.left
.right
你可以使用以下系統(tǒng)按鍵修飾符來(lái)觸發(fā)鼠標(biāo)或鍵盤事件監(jiān)聽(tīng)器,只有當(dāng)按鍵被按下時(shí)才會(huì)觸發(fā)。
.ctrl
.alt
.shift
.meta
例如:
<!-- Alt + Enter --> <input @keyup.alt.enter="clear" /> <!-- Ctrl + 點(diǎn)擊 --> <div @click.ctrl="doSomething">Do something</div>
請(qǐng)注意,系統(tǒng)按鍵修飾符和常規(guī)按鍵不同。與keyup
事件一起使用時(shí),該按鍵必須在事件發(fā)出時(shí)處于按下?tīng)顟B(tài)。
換句話說(shuō),keyup.ctrl
只會(huì)在你仍然按住ctrl
但松開(kāi)了另一個(gè)鍵時(shí)被觸發(fā)。若你單獨(dú)松開(kāi)ctrl
鍵將不會(huì)觸發(fā)。
.exact
修飾符允許控制觸發(fā)一個(gè)事件所需的確定組合的系統(tǒng)按鍵修飾符。
<!-- 當(dāng)按下 Ctrl 時(shí),即使同時(shí)按下 Alt 或 Shift 也會(huì)觸發(fā) --> <button @click.ctrl="onClick">A</button> <!-- 僅當(dāng)按下 Ctrl 且未按任何其他鍵時(shí)才會(huì)觸發(fā) --> <button @click.ctrl.exact="onCtrlClick">A</button> <!-- 僅當(dāng)沒(méi)有按下任何系統(tǒng)按鍵時(shí)觸發(fā) --> <button @click.exact="onClick">A</button>
你可以使用以下鼠標(biāo)按鍵修飾符來(lái)觸發(fā)鼠標(biāo)事件監(jiān)聽(tīng)器:
.left
.right
.middle
這些修飾符將處理程序限定為由特定鼠標(biāo)按鍵觸發(fā)的事件。
Vue 為什么會(huì)在 HTML 中監(jiān)聽(tīng)事件?
我們發(fā)現(xiàn)Vue
是在template
中直接綁定事件的,這違背了「關(guān)注點(diǎn)分離」的概念。但是不用擔(dān)心,Vue
把事件處理方法和表達(dá)式都嚴(yán)格的綁定到當(dāng)前視圖的ViewModel
上,他不會(huì)導(dǎo)致任何維護(hù)上的困難。
當(dāng)我們使用v-on
在視圖上綁定事件處理,有幾個(gè)好處:
1、掃一眼HTML
模版便能輕松定位JavaScript
里面對(duì)應(yīng)的方法。
2、無(wú)須在JavaScript
里手動(dòng)綁定事件,你的ViewModel
代碼可以是非純粹的邏輯,和DOM
完全解藕,更容易測(cè)試。
3、當(dāng)一個(gè)ViewModel
銷毀的時(shí)候,所有的事件處理器都會(huì)自動(dòng)被刪除。你需要擔(dān)心如何清理它們。
以上就是Vue 事件處理函數(shù)的綁定示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Vue 事件處理函數(shù)綁定的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue 項(xiàng)目部署到服務(wù)器的問(wèn)題解決方法
本篇文章主要介紹了Vue 項(xiàng)目部署到服務(wù)器的問(wèn)題解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12vue中mock數(shù)據(jù),模擬后臺(tái)接口實(shí)例
這篇文章主要介紹了vue中mock數(shù)據(jù),模擬后臺(tái)接口實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04Vue3中的element-plus表格實(shí)現(xiàn)代碼
這篇文章主要介紹了Vue3中的element-plus表格實(shí)現(xiàn)代碼,用組件屬性實(shí)現(xiàn)跳轉(zhuǎn)路由,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05vue 實(shí)現(xiàn)路由跳轉(zhuǎn)時(shí)更改頁(yè)面title
今天小編就為大家分享一篇vue 實(shí)現(xiàn)路由跳轉(zhuǎn)時(shí)更改頁(yè)面title,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11解決vant的Cascader級(jí)聯(lián)選擇組建css樣式錯(cuò)亂問(wèn)題
這篇文章主要介紹了解決vant的Cascader級(jí)聯(lián)選擇組建css樣式錯(cuò)亂問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Vite+Vue3使用MockJS的實(shí)現(xiàn)示例
寫(xiě)一些純前端的項(xiàng)目時(shí),自己造數(shù)據(jù)有些麻煩,于是我們可以利用mock造一些簡(jiǎn)單的數(shù)據(jù),來(lái)滿足我們的需求,本文主要介紹了Vite+Vue3使用MockJS的實(shí)現(xiàn)示例,感興趣的可以了解一下2024-01-01