vue項目中銷毀window.addEventListener事件監(jiān)聽解析
銷毀window.addEventListener事件監(jiān)聽
今天在做項目的過程中,組件中調(diào)用iframe時,由于在組件的created方法中寫了監(jiān)聽,用于接收iframe發(fā)來的信息,但是在組件銷毀的時候并沒有去掉監(jiān)聽,導致組件創(chuàng)建幾次,監(jiān)聽方法就會執(zhí)行幾次,特此記錄
created() { ? ? window.addEventListener('message', this.receiveMessage, false) ? },
beforeDestroy() { // 在組件生命周期結(jié)束的時候銷毀。 ? ? window.removeEventListener('message', this.receiveMessage, false) ? },
window.addEventListener監(jiān)聽scroll事件
今天想在vue的項目里面用下拉加載,然后就直接寫了:
mounted () { ?? ?window.addEventListener( 'scroll', this.scrollHander) }, methods: { ?? ?scrollHander () { ?} }
但是我發(fā)現(xiàn)我切換路由以后依舊其他頁面也觸發(fā)了scrollHandler函數(shù),然后我想到使用了vue-router做的spa項目,window對象不變的,所以需要在每次使用后銷毀。
解決辦法
我回去看了下vue文檔的生命周期,看到了destroyed,然后直接在這個周期內(nèi)銷毀就可以了。
mounted () { ?? ?window.addEventListener('scroll', this.scrollHander) }, destroyed () { ?? ?window.removeEventListener('scroll', this.scrollHander) }
使用throttle出現(xiàn)的新問題
下拉加載一般需要配合throttle限流函數(shù)(原理可以看這里)來避免頻繁觸發(fā),所以優(yōu)化代碼成這樣:
mounted () { ?? ?let ?_this = this ?? ?window.addEventListener('scroll', throttle(() => { ?? ??? ?_this.scrollHander() ?? ?},200 )) },
然后發(fā)現(xiàn)沒法用removeEventListener了,因為這個函數(shù)第二個參數(shù)不接受匿名函數(shù)。
最后代碼
用一個變量中轉(zhuǎn)下
mounted () { ?? ?let ?_this = this ?? ?this.throttleLoad = throttle(() =>{ ?? ??? ?_this.scrollHander() ?? ?},200) ?? ?window.addEventListener('scroll', this.throttleLoad) }, destroyed () { ?? ?window.removeEventListener('scroll',this.throttleLoad)? }, methods: {? ?? ?scrollHander () { } }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue-router啟用history模式下的開發(fā)及非根目錄部署方法
這篇文章主要介紹了vue-router啟用history模式下的開發(fā)及非根目錄部署方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12Vue.js基礎(chǔ)之監(jiān)聽子組件事件v-on及綁定數(shù)據(jù)v-model學習
這篇文章主要為大家介紹了Vue.js基礎(chǔ)之監(jiān)聽子組件事件v-on及綁定數(shù)據(jù)v-model學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06vue中v-for和v-if不能在同一個標簽使用的最新解決方案
這篇文章主要介紹了vue中v-for和v-if不能在同一個標簽的最新解決方案,這里描述了兩種解決方案,結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-07-07