Vue中使用addEventListener添加事件、removeEventListener移除事件的示例詳解
在vue中如何使用addEventListener添加事件、removeEventListener移除事件
最近在項(xiàng)目中需要用到addEventListener監(jiān)聽(tīng)滾動(dòng)條滾動(dòng)的高度,所以就研究了一下在vue中是怎么進(jìn)行事件監(jiān)聽(tīng)的。
添加事件
給要添加事件的元素加上ref屬性
在mounted中添加事件
mounted() { this.$refs.box.addEventListener('scroll',()=>{ console.log('scroll',this.$refs.box.scrollTop) }); }
這樣就添加成功了!
移除事件
如果要移除已添加的事件,removeEventListener中傳入的方法必須和addEventListener中傳入的是同一個(gè)方法才能成功移除,所以在添加時(shí)就不能用匿名函數(shù)啦。需改成如下寫(xiě)法
mounted() { this.$refs.box.addEventListener('scroll',this.scrollEvent); }, methods:{ scrollEvent(){ console.log('scroll',this.$refs.box.scrollTop) } }
這里要注意 傳入的方法 this.scrollEvent 后面不能加括號(hào),否則無(wú)法成功添加
組件銷(xiāo)毀前移除事件
beforeDestroy() { this.$refs.box.removeEventListener('scroll',this.scrollEvent); }
如果是keep-alive組件,可以用下面這種方式
activated() { this.$refs.box.addEventListener('scroll', this.scrollEvent); }, deactivated(){ this.$refs.box.removeEventListener('scroll',this.scrollEvent); },
另外,addEventListener還可以給一個(gè)元素添加多個(gè)事件,并且不會(huì)覆蓋已存在的事件,這里就不多展開(kāi)了~
擴(kuò)展知識(shí):
解析Vuejs使用addEventListener的事件觸發(fā)執(zhí)行函數(shù)的this問(wèn)題
1、使用瀏覽器監(jiān)聽(tīng)切屏為例
此處為考慮瀏覽器兼容性推薦使用:document.addEventListener
1.1、正常函數(shù)使用如下:
let n = 0; let max = 3; // 切屏最大次數(shù) document.addEventListener("visibilitychange", function () { if(document.visibilityState == 'hidden'){ n++; } else if(document.visibilityState == 'visible') { if (n > max) { this.$alert('你已經(jīng)切換離開(kāi)考試頁(yè)面超過(guò)'+max+"次系統(tǒng)將自動(dòng)提交答卷!", '警告', { confirmButtonText: '知道了', callback: action => { this.msgSuccess("系統(tǒng)自動(dòng)提交答卷!"); } }); return; } this.$alert('你已經(jīng)切換離開(kāi)考試頁(yè)面'+n+'次,如果超過(guò)'+max+"次系統(tǒng)會(huì)自動(dòng)提交答卷,請(qǐng)認(rèn)真作答!", '警告', { confirmButtonText: '知道了', callback: action => {} }); } });
this.$alert()
為vue的MessageBox彈框組件
運(yùn)行后報(bào):
提示this.$alert()不是一個(gè)函數(shù)
此時(shí)我們嘗試在document函數(shù)里面打印this到控制臺(tái)看看
console.log("this===",this);
控制臺(tái)輸出信息:
指向的是調(diào)用addEventListener的對(duì)象
我們使用document對(duì)象去調(diào)用VueJS的組件函數(shù)肯定是行不通的,那么怎樣可以拿到VueJS的this呢?我們只需稍作修改
1.2、bind()綁定事件指定函數(shù)
修改后的代碼如下:
let n = 0; let max = 3; // 切屏最大次數(shù) let fn = function () { console.log("this===",this); if(document.visibilityState == 'hidden'){ n++; } else if(document.visibilityState == 'visible') { if (n > max) { this.$alert('你已經(jīng)切換離開(kāi)考試頁(yè)面超過(guò)'+max+"次系統(tǒng)將自動(dòng)提交答卷!", '警告', { confirmButtonText: '知道了', callback: action => { this.msgSuccess("系統(tǒng)自動(dòng)提交答卷!"); } }); return; } this.$alert('你已經(jīng)切換離開(kāi)考試頁(yè)面'+n+'次,如果超過(guò)'+max+"次系統(tǒng)會(huì)自動(dòng)提交答卷,請(qǐng)認(rèn)真作答!", '警告', { confirmButtonText: '知道了', callback: action => {} }); } } // 使用bind綁定的事件才是指向函數(shù),否則指向的是調(diào)用addEventListener的對(duì)象 document.addEventListener("visibilitychange", fn.bind(this));
詳解:
將觸發(fā)事件后執(zhí)行的函數(shù)抽到外部,作為外部函數(shù)并賦予函數(shù)名在事件中使用函數(shù)名.bind('指定函數(shù)')
;即可在執(zhí)行的函數(shù)中獲取到bind綁定的指定函數(shù)
控制臺(tái)查看此時(shí)的this為
效果圖:
下面介紹下vue 監(jiān)聽(tīng)事件addEventListener
代碼如下所示:
// vue 添加監(jiān)聽(tīng)事件,addEventListener第二個(gè)參數(shù)要綁在this上,即需要在methods中聲明,否則銷(xiāo)毀的時(shí)候會(huì)報(bào)錯(cuò) // 在mounted中監(jiān)聽(tīng),在beforeDestroy中銷(xiāo)毀,綁定的事件在methods中聲明 mounted() { // 監(jiān)聽(tīng) window.addEventListener('resize', this.handleEventListener) }, beforeDestroy() { // 銷(xiāo)毀 window.removeEventListener('resize', this.handleEventListener) }, methods: { // 監(jiān)聽(tīng)執(zhí)行的事件 handleEventListener() { }, }
到此這篇關(guān)于解析Vuejs使用addEventListener的事件觸發(fā)執(zhí)行函數(shù)的this問(wèn)題的文章就介紹到這了,更多相關(guān)vuejs addEventListener的事件觸發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue系列之Element?UI表單自定義校驗(yàn)規(guī)則
表單校驗(yàn)是注冊(cè)環(huán)節(jié)中必不可少的操作,表單校驗(yàn)可以提醒用戶(hù)填寫(xiě)數(shù)據(jù)規(guī)則以確保用戶(hù)提交數(shù)據(jù)的效性,也可以防止用戶(hù)因誤操作而占用服務(wù)器資源,這篇文章主要給大家介紹了關(guān)于Vue系列之Element?UI表單自定義校驗(yàn)規(guī)則的相關(guān)資料,需要的朋友可以參考下2022-09-09vue中g(shù)et和post請(qǐng)求的區(qū)別點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是一篇關(guān)于vue中g(shù)et和post請(qǐng)求的區(qū)別點(diǎn)總結(jié)內(nèi)容,對(duì)此有興趣的朋友們可以跟著學(xué)習(xí)下。2021-12-12vue頁(yè)面渲染數(shù)組中數(shù)據(jù)文案后添加逗號(hào)最后不加
這篇文章主要為大家介紹了vue頁(yè)面渲染數(shù)組中數(shù)據(jù)文案后添加逗號(hào)最后不加逗號(hào)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Vue.js項(xiàng)目實(shí)戰(zhàn)之多語(yǔ)種網(wǎng)站的功能實(shí)現(xiàn)(租車(chē))
這篇文章主要介紹了Vue.js項(xiàng)目實(shí)戰(zhàn)之多語(yǔ)種網(wǎng)站(租車(chē))的功能實(shí)現(xiàn) ,需要的朋友可以參考下2019-08-08vue進(jìn)度條組件實(shí)現(xiàn)代碼(可拖拽可點(diǎn)擊)
在日常開(kāi)發(fā)中隨著需求的個(gè)性化,邏輯的復(fù)雜化,自定義組件也變得越來(lái)越常見(jiàn),這篇文章主要給大家介紹了關(guān)于vue進(jìn)度條組件實(shí)現(xiàn)(可拖拽可點(diǎn)擊)的相關(guān)資料,需要的朋友可以參考下2023-12-12vue打包通過(guò)image-webpack-loader插件對(duì)圖片壓縮優(yōu)化操作
這篇文章主要介紹了vue打包通過(guò)image-webpack-loader插件對(duì)圖片壓縮優(yōu)化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11React和Vue實(shí)現(xiàn)路由懶加載的示例代碼
路由懶加載是一項(xiàng)關(guān)鍵技術(shù),它可以幫助我們提高Web應(yīng)用的加載速度,本文主要介紹了React和Vue實(shí)現(xiàn)路由懶加載的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01Vue數(shù)據(jù)雙向綁定的實(shí)現(xiàn)方式講解
Vue數(shù)據(jù)雙向綁定原理:Vue內(nèi)部通過(guò)Object.defineProperty方法屬性攔截的方式,把data對(duì)象里每個(gè)數(shù)據(jù)的讀寫(xiě)轉(zhuǎn)化成getter/setter,當(dāng)數(shù)據(jù)變化時(shí)通知視圖更新2022-08-08Vue的路由及路由鉤子函數(shù)的實(shí)現(xiàn)
這篇文章主要介紹了Vue的路由及路由鉤子函數(shù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07