Vue中使用addEventListener添加事件、removeEventListener移除事件的示例詳解
在vue中如何使用addEventListener添加事件、removeEventListener移除事件
最近在項目中需要用到addEventListener監(jiān)聽滾動條滾動的高度,所以就研究了一下在vue中是怎么進行事件監(jiān)聽的。
添加事件
給要添加事件的元素加上ref屬性

在mounted中添加事件
mounted() {
this.$refs.box.addEventListener('scroll',()=>{
console.log('scroll',this.$refs.box.scrollTop)
});
}這樣就添加成功了!

移除事件
如果要移除已添加的事件,removeEventListener中傳入的方法必須和addEventListener中傳入的是同一個方法才能成功移除,所以在添加時就不能用匿名函數(shù)啦。需改成如下寫法
mounted() {
this.$refs.box.addEventListener('scroll',this.scrollEvent);
},
methods:{
scrollEvent(){
console.log('scroll',this.$refs.box.scrollTop)
}
}這里要注意 傳入的方法 this.scrollEvent 后面不能加括號,否則無法成功添加
組件銷毀前移除事件
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還可以給一個元素添加多個事件,并且不會覆蓋已存在的事件,這里就不多展開了~
擴展知識:
解析Vuejs使用addEventListener的事件觸發(fā)執(zhí)行函數(shù)的this問題
1、使用瀏覽器監(jiān)聽切屏為例
此處為考慮瀏覽器兼容性推薦使用: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)切換離開考試頁面超過'+max+"次系統(tǒng)將自動提交答卷!", '警告', {
confirmButtonText: '知道了',
callback: action => {
this.msgSuccess("系統(tǒng)自動提交答卷!");
}
});
return;
}
this.$alert('你已經(jīng)切換離開考試頁面'+n+'次,如果超過'+max+"次系統(tǒng)會自動提交答卷,請認真作答!", '警告', {
confirmButtonText: '知道了',
callback: action => {}
});
}
});this.$alert()為vue的MessageBox彈框組件
運行后報:

提示this.$alert()不是一個函數(shù)
此時我們嘗試在document函數(shù)里面打印this到控制臺看看
console.log("this===",this);
控制臺輸出信息:

指向的是調用addEventListener的對象
我們使用document對象去調用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)切換離開考試頁面超過'+max+"次系統(tǒng)將自動提交答卷!", '警告', {
confirmButtonText: '知道了',
callback: action => {
this.msgSuccess("系統(tǒng)自動提交答卷!");
}
});
return;
}
this.$alert('你已經(jīng)切換離開考試頁面'+n+'次,如果超過'+max+"次系統(tǒng)會自動提交答卷,請認真作答!", '警告', {
confirmButtonText: '知道了',
callback: action => {}
});
}
}
// 使用bind綁定的事件才是指向函數(shù),否則指向的是調用addEventListener的對象
document.addEventListener("visibilitychange", fn.bind(this));詳解:
將觸發(fā)事件后執(zhí)行的函數(shù)抽到外部,作為外部函數(shù)并賦予函數(shù)名在事件中使用函數(shù)名.bind('指定函數(shù)');即可在執(zhí)行的函數(shù)中獲取到bind綁定的指定函數(shù)
控制臺查看此時的this為

效果圖:

下面介紹下vue 監(jiān)聽事件addEventListener
代碼如下所示:
// vue 添加監(jiān)聽事件,addEventListener第二個參數(shù)要綁在this上,即需要在methods中聲明,否則銷毀的時候會報錯
// 在mounted中監(jiān)聽,在beforeDestroy中銷毀,綁定的事件在methods中聲明
mounted() {
// 監(jiān)聽
window.addEventListener('resize', this.handleEventListener)
},
beforeDestroy() {
// 銷毀
window.removeEventListener('resize', this.handleEventListener)
},
methods: {
// 監(jiān)聽執(zhí)行的事件
handleEventListener() {
},
}到此這篇關于解析Vuejs使用addEventListener的事件觸發(fā)執(zhí)行函數(shù)的this問題的文章就介紹到這了,更多相關vuejs addEventListener的事件觸發(fā)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
利用vue對比兩組數(shù)據(jù)差異的可視化組件詳解
這篇文章主要給大家介紹了關于利用vue對比兩組數(shù)據(jù)差異的可視化組件的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用vue具有一定的參考學習價值,需要的朋友可以參考下2021-09-09
Vue+Openlayer中使用select選擇要素的實現(xiàn)代碼
本文通過實例代碼給大家介紹Vue+Openlayer中使用select選擇要素,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-08-08
vue項目使用axios發(fā)送請求讓ajax請求頭部攜帶cookie的方法
今天小編就為大家分享一篇vue項目使用axios發(fā)送請求讓ajax請求頭部攜帶cookie的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09
vue動態(tài)路由實現(xiàn)多級嵌套面包屑的思路與方法
在實際項目中我們會碰到多層嵌套的組件組合而成,比如我們常見的面包屑導航,下面這篇文章就來給大家介紹關于vue實現(xiàn)動態(tài)路由多級嵌套面包屑的思路與方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08

