Vue?事件處理函數(shù)的綁定示例詳解
正文
在 JS 中「事件」是不需要綁定的,瀏覽器自帶了許多的事件,每個事件都可以去綁定「處理器(處理函數(shù))」。
事件 ==> 用戶行為 ==> 觸發(fā)瀏覽器的事件 ==> 執(zhí)行對應(yīng)的事件處理函數(shù)
我們通常通過addEventListenet方法去給事件綁定處理函數(shù):
document.addEventListenet("click", function () {
// do...
}, flase);
需要注意的是addEventListenet只是「綁定」事件處理函數(shù)并不是「執(zhí)行」!處理函數(shù)只會在對應(yīng)事件觸發(fā)的時候才會進行執(zhí)行。
某些情況下,我們需要把處理函數(shù)獨立出去,并且需要更改this的執(zhí)行,這是因為事件處理函數(shù)的this指向元素本身,也就意味著我們不能使用.call來更改this的指向,因為.call方法會立即執(zhí)行函數(shù)!
// 這會導(dǎo)致 test 立即執(zhí)行!
document.addEventListenet("click", test.call(this), flase);
// 可以利用 .bind 方法放心的去指向 this,因為 bind 不會立即執(zhí)行
document.addEventListenet("click", test.bind(this), flase);
Vue 的事件處理綁定
來到Vue,Vue提供了v-on指令讓開發(fā)者對元素綁定事件處理函數(shù),例如:
<div v-on:click="methodName"></div> <!-- 或者使用 @click 對 v-on 進行簡寫 --> <div @click="handler"></div>
v-on的值可以是JS表達式:
<button @click="count += 1">Add</button>
不推薦這樣做,應(yīng)該把邏輯放到methods里面處理。
v-on的值還可以是一個方法事件處理器:
<button @click="onClickAdd">Add</button>
@click接受一個方法名或?qū)δ硞€方法的調(diào)用。
當通過方法名去綁定事件處理函數(shù)的時候,我們可以給方法傳遞參數(shù):
<div>
<h1>{{ count }}</h1>
<button @click="onClickAdd(2)">Add</button>
<button @click="onClickMinus(2, $event)">Minus</button>
</div>
以上代碼,button在綁定了onClickAdd和onClickMinus處理函數(shù)后不會立即執(zhí)行,而是當事件觸發(fā)后才執(zhí)行,這會開頭我們說的addEventListenet是一樣的!
而onClickAdd和onClickMinus的括號是為了方便我們傳遞想要參數(shù)方便在methdos里進行處理。
這里有一個特殊的參數(shù)$event,該屬性是Vue內(nèi)部封裝的一個屬性,表示觸發(fā)事件的事件對象。
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ù),例如:
<div>
<h1>{{ count }}</h1>
<button @click="onClickAdd(),setLog()">Add</button>
<button @click="onClickMinus">Minus</button>
</div>
只要在兩個方法的中間用,分隔就可以同時綁定兩個事件處理函數(shù)啦。
事件修飾符
我們在處理事件時可能會調(diào)用event.preventDefault()或event.stopPropagation()是很常見的。Vue提供了一套「修飾符」來幫助我們完成這些事件,這么做的目的是讓開發(fā)者更專注于數(shù)據(jù)邏輯而不用去處理DOM事件的細節(jié)。
修飾符是用 . 表示的指令后綴,包含以下這些:
.stop:阻止事件冒泡。.prevent:阻止事件的默認行為。.self:當event.target是元素本身時才會觸發(fā)事件處理器 。.capture:采用事件捕獲。.once:事件調(diào)用一次后,自動移除監(jiān)聽器。.passive:修飾符一般用于觸摸事件的監(jiān)聽器,可以用來改善移動端設(shè)備的滾屏性能。
?? 注意
不能同時使用.passive和.prevent,因為.passive已經(jīng)向瀏覽器表明了你不想阻止事件的默認行為。
如果你這么做了,則.prevent會被忽略,并且瀏覽器會拋出警告。
<!-- 單擊事件將停止傳遞 --> <a @click.stop="doThis"></a> <!-- 提交事件將不再重新加載頁面 --> <form @submit.prevent="onSubmit"></form> <!-- 修飾語可以使用鏈式書寫 --> <a @click.stop.prevent="doThat"></a> <!-- 也可以只有修飾符 --> <form @submit.prevent></form> <!-- 僅當 event.target 是元素本身時才會觸發(fā)事件處理器 --> <!-- 例如:事件處理器不來自子元素 --> <div @click.self="doThat">...</div>
使用修飾符時需要注意調(diào)用順序,因為相關(guān)代碼是以相同的順序生成的。因此使用@click.prevent.self會阻止元素及其子元素的所有點擊事件的默認行為,而@click.self.prevent則只會阻止對元素本身的點擊事件的默認行為。
按鍵修飾符
我們通過可能還需要通過event.keycode來判斷用戶觸發(fā)的按鍵,Vue允許在v-on或@監(jiān)聽按鍵事件時添加按鍵修飾符,例如:
<!-- 僅在 `key` 為 `Enter` 時調(diào)用 `submit` --> <input @keyup.enter="submit" />
你可以直接使用KeyboardEvent.key暴露的按鍵名稱作為修飾符,但需要轉(zhuǎn)為 kebab-case 形式。
<input @keyup.page-down="onPageDown" />
Vue為一些常用的按鍵提供了別名:
.enter.tab.delete(捕獲“Delete”和“Backspace”兩個按鍵).esc.space.up.down.left.right
你可以使用以下系統(tǒng)按鍵修飾符來觸發(fā)鼠標或鍵盤事件監(jiān)聽器,只有當按鍵被按下時才會觸發(fā)。
.ctrl.alt.shift.meta
例如:
<!-- Alt + Enter --> <input @keyup.alt.enter="clear" /> <!-- Ctrl + 點擊 --> <div @click.ctrl="doSomething">Do something</div>
請注意,系統(tǒng)按鍵修飾符和常規(guī)按鍵不同。與keyup事件一起使用時,該按鍵必須在事件發(fā)出時處于按下狀態(tài)。
換句話說,keyup.ctrl只會在你仍然按住ctrl但松開了另一個鍵時被觸發(fā)。若你單獨松開ctrl鍵將不會觸發(fā)。
.exact修飾符允許控制觸發(fā)一個事件所需的確定組合的系統(tǒng)按鍵修飾符。
<!-- 當按下 Ctrl 時,即使同時按下 Alt 或 Shift 也會觸發(fā) --> <button @click.ctrl="onClick">A</button> <!-- 僅當按下 Ctrl 且未按任何其他鍵時才會觸發(fā) --> <button @click.ctrl.exact="onCtrlClick">A</button> <!-- 僅當沒有按下任何系統(tǒng)按鍵時觸發(fā) --> <button @click.exact="onClick">A</button>
你可以使用以下鼠標按鍵修飾符來觸發(fā)鼠標事件監(jiān)聽器:
.left.right.middle
這些修飾符將處理程序限定為由特定鼠標按鍵觸發(fā)的事件。
Vue 為什么會在 HTML 中監(jiān)聽事件?
我們發(fā)現(xiàn)Vue是在template中直接綁定事件的,這違背了「關(guān)注點分離」的概念。但是不用擔心,Vue把事件處理方法和表達式都嚴格的綁定到當前視圖的ViewModel上,他不會導(dǎo)致任何維護上的困難。
當我們使用v-on在視圖上綁定事件處理,有幾個好處:
1、掃一眼HTML模版便能輕松定位JavaScript里面對應(yīng)的方法。
2、無須在JavaScript里手動綁定事件,你的ViewModel代碼可以是非純粹的邏輯,和DOM完全解藕,更容易測試。
3、當一個ViewModel銷毀的時候,所有的事件處理器都會自動被刪除。你需要擔心如何清理它們。
以上就是Vue 事件處理函數(shù)的綁定示例詳解的詳細內(nèi)容,更多關(guān)于Vue 事件處理函數(shù)綁定的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
el-input輸入校驗不能為空格以及不能輸入全部為空的內(nèi)容
這篇文章主要給大家介紹了關(guān)于el-input輸入校驗不能為空格以及不能輸入全部為空的內(nèi)容的相關(guān)資料,el-input驗證規(guī)則主要是為了確保輸入的內(nèi)容符合特定的要求,需要的朋友可以參考下2023-10-10
詳解vue+axios給開發(fā)環(huán)境和生產(chǎn)環(huán)境配置不同的接口地址
這篇文章主要介紹了詳解vue+axios給開發(fā)環(huán)境和生產(chǎn)環(huán)境配置不同的接口地址,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Vue使用json-server進行后端數(shù)據(jù)模擬功能
這篇文章主要介紹了Vue使用json-server進行后端數(shù)據(jù)模擬功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-04-04
vue3自定義指令自動獲取節(jié)點的width和height代碼示例
這篇文章主要介紹了如何使用ResizeObserver監(jiān)聽組件的寬度和高度,并將其封裝成一個指令以便全局或局部使用,ResizeObserver可以監(jiān)聽元素的多個尺寸屬性,如top、bottom、left等,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-11-11
vue element-ui table組件動態(tài)生成表頭和數(shù)據(jù)并修改單元格格式 父子組件通信
這篇文章主要介紹了vue element-ui table組件動態(tài)生成表頭和數(shù)據(jù)并修改單元格格式 父子組件通信,需要的朋友可以參考下2019-08-08
vue實現(xiàn)歌手列表字母排序下拉滾動條側(cè)欄排序?qū)崟r更新
這篇文章主要介紹了vue實現(xiàn)歌手列表字母排序,下拉滾動條側(cè)欄排序?qū)崟r更新,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05
el-input寬度跟隨輸入內(nèi)容自適應(yīng)的實現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于el-input寬度跟隨輸入內(nèi)容自適應(yīng)的實現(xiàn)方法,我們再實際應(yīng)用中可能需要input文本框能夠根據(jù)輸入字符的所占據(jù)的寬度自動調(diào)節(jié)尺寸,需要的朋友可以參考下2023-08-08

