簡介
????????Vue提供了事件綁定的語法糖旺垒,我們在標簽中可直接使用形如v-on:click,@click,@focus的形式綁定事件監(jiān)聽器延欠,并且可以使用修飾符對事件進行option設置涛酗。本次解釋下prevent 與passive的修飾符铡原。prevent?是攔截默認事件偷厦,passive是不攔截默認事件。
prevent
? ? ? ? 某些標簽擁有自身的默認事件燕刻,如a[href="#"]只泼,button[type="submit"] 這種標簽在冒泡結束后會開始執(zhí)行默認事件。注意默認事件雖然是冒泡后開始卵洗,但不會因為stop阻止事件傳遞而停止请唱。
? ? ? ? 如上圖1,我在第三次捕獲后終止事件傳遞过蹂,但是最后輸出了1 2 3 x十绑。
? ? ? ? 如上圖2,我們在a標簽上的click加個prevent的修飾符酷勺,最后輸出 1 2 3 4 4 3 2 1本橙。默認的href里的事件沒有觸發(fā)。
passive
? ? ? ? passive這個修飾符會執(zhí)行默認方法脆诉。你們可能會問甚亭,明明默認執(zhí)行為什么會設置這樣一個修飾符。這就要說一下這個修飾符的本意了击胜。
????????【瀏覽器只有等內核線程執(zhí)行到事件監(jiān)聽器對應的JavaScript代碼時亏狰,才能知道內部是否會調用preventDefault函數(shù)來阻止事件的默認行為,所以瀏覽器本身是沒有辦法對這種場景進行優(yōu)化的偶摔。這種場景下暇唾,用戶的手勢事件無法快速產(chǎn)生,會導致頁面無法快速執(zhí)行滑動邏輯啰挪,從而讓用戶感覺到頁面卡頓信不。】
? ? ? ? 通俗點說就是每次事件產(chǎn)生亡呵,瀏覽器都會去查詢一下是否有preventDefault阻止該次事件的默認動作抽活。我們加上passive就是為了告訴瀏覽器,不用查詢了锰什,我們沒用preventDefault阻止默認動作下硕。
? ? ? ? 這里一般用在滾動監(jiān)聽,@scoll汁胆,@touchmove 梭姓。因為滾動監(jiān)聽過程中,移動每個像素都會產(chǎn)生一次事件嫩码,每次都使用內核線程查詢prevent會使滑動卡頓誉尖。我們通過passive將內核線程查詢跳過,可以大大提升滑動的流暢度铸题。
注:passive和prevent沖突铡恕,不能同時綁定在一個監(jiān)聽器上琢感。