首頁 > 軟體

Vue中使用addEventListener新增事件、removeEventListener移除事件的範例詳解

2022-12-31 14:01:20

在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的事件觸發內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com