Vue中使用addEventListener添加事件、removeEventListener移除事件的示例詳解
在vue中如何使用addEventListener添加事件、removeEventListener移除事件
最近在項目中需要用到addEventListener監聽滾動條滾動的高度,所以就研究瞭一下在vue中是怎麼進行事件監聽的。
添加事件
給要添加事件的元素加上ref屬性
在mounted中添加事件
mounted() { this.$refs.box.addEventListener('scroll',()=>{ console.log('scroll',this.$refs.box.scrollTop) }); }
這樣就添加成功瞭!
移除事件
如果要移除已添加的事件,removeEventListener中傳入的方法必須和addEventListener中傳入的是同一個方法才能成功移除,所以在添加時就不能用匿名函數啦。需改成如下寫法
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的事件觸發執行函數的this問題
1、使用瀏覽器監聽切屏為例
此處為考慮瀏覽器兼容性推薦使用:document.addEventListener
1.1、正常函數使用如下:
let n = 0; let max = 3; // 切屏最大次數 document.addEventListener("visibilitychange", function () { if(document.visibilityState == 'hidden'){ n++; } else if(document.visibilityState == 'visible') { if (n > max) { this.$alert('你已經切換離開考試頁面超過'+max+"次系統將自動提交答卷!", '警告', { confirmButtonText: '知道瞭', callback: action => { this.msgSuccess("系統自動提交答卷!"); } }); return; } this.$alert('你已經切換離開考試頁面'+n+'次,如果超過'+max+"次系統會自動提交答卷,請認真作答!", '警告', { confirmButtonText: '知道瞭', callback: action => {} }); } });
this.$alert()
為vue的MessageBox彈框組件
運行後報:
提示this.$alert()不是一個函數
此時我們嘗試在document函數裡面打印this到控制臺看看
console.log("this===",this);
控制臺輸出信息:
指向的是調用addEventListener的對象
我們使用document對象去調用VueJS的組件函數肯定是行不通的,那麼怎樣可以拿到VueJS的this呢?我們隻需稍作修改
1.2、bind()綁定事件指定函數
修改後的代碼如下:
let n = 0; let max = 3; // 切屏最大次數 let fn = function () { console.log("this===",this); if(document.visibilityState == 'hidden'){ n++; } else if(document.visibilityState == 'visible') { if (n > max) { this.$alert('你已經切換離開考試頁面超過'+max+"次系統將自動提交答卷!", '警告', { confirmButtonText: '知道瞭', callback: action => { this.msgSuccess("系統自動提交答卷!"); } }); return; } this.$alert('你已經切換離開考試頁面'+n+'次,如果超過'+max+"次系統會自動提交答卷,請認真作答!", '警告', { confirmButtonText: '知道瞭', callback: action => {} }); } } // 使用bind綁定的事件才是指向函數,否則指向的是調用addEventListener的對象 document.addEventListener("visibilitychange", fn.bind(this));
詳解:
將觸發事件後執行的函數抽到外部,作為外部函數並賦予函數名在事件中使用函數名.bind('指定函數')
;即可在執行的函數中獲取到bind綁定的指定函數
控制臺查看此時的this為
效果圖:
下面介紹下vue 監聽事件addEventListener
代碼如下所示:
// vue 添加監聽事件,addEventListener第二個參數要綁在this上,即需要在methods中聲明,否則銷毀的時候會報錯 // 在mounted中監聽,在beforeDestroy中銷毀,綁定的事件在methods中聲明 mounted() { // 監聽 window.addEventListener('resize', this.handleEventListener) }, beforeDestroy() { // 銷毀 window.removeEventListener('resize', this.handleEventListener) }, methods: { // 監聽執行的事件 handleEventListener() { }, }
到此這篇關於解析Vuejs使用addEventListener的事件觸發執行函數的this問題的文章就介紹到這瞭,更多相關vuejs addEventListener的事件觸發內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- vue中的addEventListener和removeEventListener用法說明
- VUE生命周期全面系統詳解
- JS前端性能優化解決內存泄漏頁面崩潰
- Vue實現監聽某個元素滾動,親測有效
- React實現監聽粘貼事件並獲取粘貼板中的截圖