国产女主播成人av-亚洲国产精品黑人久久久-欧美日韩一区二区三区gif-91综合久久噜久久-国产日韩欧美在线观看大片-国产一区二区三区御姐-开心激情婷婷久久视频-亚洲精品日韩在线观看视频网站-亚洲av欧美av日韩av,日本色一区二区三区,国产亚洲成性色av人片在线观,国产91熟女高潮一区二区抖

歡迎來到合肥浪訊網(wǎng)絡(luò)科技有限公司官網(wǎng)
  咨詢服務(wù)熱線:400-099-8848

如何在Vue中正確移除事件監(jiān)聽?

發(fā)布時間:2025-11-01 文章來源:本站  瀏覽次數(shù):379
在 Vue 中正確移除事件監(jiān)聽的核心是 “在組件生命周期的合適時機,用相同的回調(diào)函數(shù)引用移除監(jiān)聽”,需結(jié)合 Vue 的生命周期鉤子(如onUnmountedbeforeDestroy)和函數(shù)引用穩(wěn)定性來實現(xiàn),避免因監(jiān)聽殘留導致內(nèi)存泄漏。以下是針對 Vue 3 和 Vue 2 的具體實現(xiàn)方法及避坑指南:

一、Vue 3(組合式 API):在onUnmounted中移除

Vue 3 的組合式 API 通過setup函數(shù)或<script setup>組織代碼,需在組件掛載時添加監(jiān)聽,在組件卸載前(onUnmounted鉤子)移除,同時確保回調(diào)函數(shù)引用唯一。

1. 基礎(chǔ)用法(監(jiān)聽window/document事件)

vue
<template>
  <div>監(jiān)聽窗口大小變化</div>
</template>

<script setup>
import { onMounted, onUnmounted } from 'vue';

// 1. 定義具名回調(diào)函數(shù)(確保整個組件生命周期內(nèi)引用唯一)
function handleResize() {
  console.log('窗口大小變化:', window.innerWidth);
}

// 2. 組件掛載時添加事件監(jiān)聽
onMounted(() => {
  window.addEventListener('resize', handleResize);
});

// 3. 組件卸載時移除監(jiān)聽(關(guān)鍵步驟)
onUnmounted(() => {
  window.removeEventListener('resize', handleResize);
});
</script>

2. 監(jiān)聽組件內(nèi)部 DOM 元素事件

若監(jiān)聽的是組件內(nèi)的 DOM 元素(如自定義按鈕、列表),需先通過ref獲取 DOM 引用,再添加 / 移除監(jiān)聽:
vue
<template>
  <button ref="myButton">點擊按鈕</button>
</template>

<script setup>
import { onMounted, onUnmounted, ref } from 'vue';

// 獲取DOM引用
const myButton = ref(null);

// 定義回調(diào)函數(shù)
function handleClick() {
  console.log('按鈕被點擊');
}

onMounted(() => {
  // 確保DOM已掛載(myButton.value存在)
  myButton.value.addEventListener('click', handleClick);
});

onUnmounted(() => {
  // 組件卸載前移除監(jiān)聽
  myButton.value.removeEventListener('click', handleClick);
});
</script>

3. 處理動態(tài)回調(diào)(依賴響應(yīng)式數(shù)據(jù))

若回調(diào)函數(shù)依賴 Vue 的響應(yīng)式數(shù)據(jù)(如ref/reactive),需確保函數(shù)引用穩(wěn)定,避免因數(shù)據(jù)更新導致函數(shù)重新創(chuàng)建(可配合useCallback緩存):
vue
<template>
  <div>計數(shù):{{ count }}</div>
</template>

<script setup>
import { onMounted, onUnmounted, ref, useCallback } from 'vue';

const count = ref(0);

// 用useCallback緩存回調(diào)函數(shù),依賴變化時才重新創(chuàng)建
const handleScroll = useCallback(() => {
  // 依賴響應(yīng)式數(shù)據(jù)count
  console.log('滾動時計數(shù):', count.value);
}, [count]); // 當count變化時,函數(shù)重新創(chuàng)建

onMounted(() => {
  window.addEventListener('scroll', handleScroll);
});

onUnmounted(() => {
  window.removeEventListener('scroll', handleScroll);
});
</script>

二、Vue 2(選項式 API):在beforeDestroy中移除

Vue 2 的選項式 API 通過mounted添加監(jiān)聽,在beforeDestroy(或destroyed)鉤子中移除,回調(diào)函數(shù)通常定義在methods中以保證引用穩(wěn)定。

1. 監(jiān)聽全局事件(window/document

vue
<template>
  <div>監(jiān)聽滾動事件</div>
</template>

<script>
export default {
  methods: {
    // 回調(diào)函數(shù)定義在methods中,引用唯一
    handleScroll() {
      console.log('頁面滾動了');
    }
  },
  mounted() {
    // 組件掛載后添加監(jiān)聽
    window.addEventListener('scroll', this.handleScroll);
  },
  beforeDestroy() {
    // 組件銷毀前移除監(jiān)聽(關(guān)鍵)
    window.removeEventListener('scroll', this.handleScroll);
  }
};
</script>

2. 監(jiān)聽組件內(nèi) DOM 元素

通過$refs獲取 DOM 元素,在mounted中添加監(jiān)聽,beforeDestroy中移除:
vue
<template>
  <div ref="content">內(nèi)容區(qū)域</div>
</template>

<script>
export default {
  methods: {
    handleClick(e) {
      console.log('內(nèi)容區(qū)域被點擊', e.target);
    }
  },
  mounted() {
    // 確保DOM已加載(this.$refs.content存在)
    this.$refs.content.addEventListener('click', this.handleClick);
  },
  beforeDestroy() {
    this.$refs.content.removeEventListener('click', this.handleClick);
  }
};
</script>

三、避坑指南:常見錯誤與解決方案

1. 回調(diào)函數(shù)引用不一致(常見問題)

  • 錯誤示例:使用匿名函數(shù)或在生命周期內(nèi)動態(tài)創(chuàng)建函數(shù),導致removeEventListener無法匹配引用:
    javascript
    運行
    // Vue 3錯誤寫法
    onMounted(() => {
      // 匿名函數(shù):每次調(diào)用引用不同
      window.addEventListener('scroll', () => { console.log('滾動'); });
    });
    onUnmounted(() => {
      // 無法移除匿名函數(shù)監(jiān)聽
      window.addEventListener('scroll', () => { console.log('滾動'); });
    });
    
  • 解決方案:始終使用具名函數(shù)(如function handleXXX())或通過useCallback(Vue 3)/methods(Vue 2)確保引用穩(wěn)定。

2. 遺漏監(jiān)聽的 “捕獲階段” 參數(shù)

  • 錯誤示例addEventListener的第三個參數(shù)(useCapture)為true時,移除時未傳入相同參數(shù),導致移除失。
    javascript
    運行
    // 添加時使用捕獲階段
    window.addEventListener('click', handleClick, true);
    // 移除時未傳第三個參數(shù)(默認false),無法匹配
    window.removeEventListener('click', handleClick);
    
  • 解決方案:移除時嚴格保持useCapture參數(shù)與添加時一致:
    javascript
    運行
    window.removeEventListener('click', handleClick, true); // 與添加時的第三個參數(shù)相同
    

3. 組件卸載時 DOM 已不存在導致報錯

  • 問題:若組件內(nèi) DOM 通過v-if銷毀,可能導致removeEventListener時 DOM 已不存在(如myButton.valuenull)。
  • 解決方案:移除前先判斷 DOM 是否存在:
    javascript
    運行
    // Vue 3示例
    onUnmounted(() => {
      if (myButton.value) { // 先判斷DOM是否存在
        myButton.value.removeEventListener('click', handleClick);
      }
    });
    

4. 忘記移除第三方庫的事件監(jiān)聽

  • 問題:使用第三方庫(如 ECharts、地圖庫)時,若庫內(nèi)部綁定了事件,需按其文檔調(diào)用銷毀方法。
  • 解決方案:在組件卸載時調(diào)用庫的銷毀函數(shù),避免內(nèi)部監(jiān)聽殘留:
    vue
    <script setup>
    import { onMounted, onUnmounted, ref } from 'vue';
    import * as echarts from 'echarts';
    
    const chartRef = ref(null);
    let chartInstance = null;
    
    onMounted(() => {
      chartInstance = echarts.init(chartRef.value);
      // 第三方庫可能內(nèi)部綁定了事件
      chartInstance.on('click', (params) => { /* 處理點擊 */ });
    });
    
    onUnmounted(() => {
      // 調(diào)用庫的銷毀方法,內(nèi)部會自動移除事件監(jiān)聽
      if (chartInstance) {
        chartInstance.dispose();
      }
    });
    </script>
    

總結(jié):Vue 中移除事件監(jiān)聽的核心步驟

  1. 定義穩(wěn)定回調(diào):用具名函數(shù)、methods(Vue 2)或useCallback(Vue 3)確;卣{(diào)函數(shù)引用唯一。
  2. 匹配生命周期:在mounted(Vue 2)/onMounted(Vue 3)中添加監(jiān)聽,在beforeDestroy(Vue 2)/onUnmounted(Vue 3)中移除。
  3. 檢查參數(shù)與 DOM:確保removeEventListener的參數(shù)(回調(diào)、useCapture)與添加時一致,且操作 DOM 前判斷其是否存在。
遵循以上步驟,可徹底避免 Vue 組件中因事件監(jiān)聽未移除導致的內(nèi)存泄漏問題。

上一條:在Vue中,如何移除鼠標...

下一條:怎樣避免前端內(nèi)存泄漏?...

婷婷久久五月天丁香-人人妻人人澡人人爽的免费网站-性久久久久久精品一区-国产91精品福利系列 | 中文字幕中文字幕人妻91av-婷婷综合狠狠爱-久久夜色精品亚洲噜噜国产-欧美激情一区二区三区视频高清 | 久久精品国产亚洲av尤物-亚洲欧美国产高清在线观看-色狠狠久久北条麻妃av-国产精品69久久久久久xxx | 日韩人妻中文视频在线-久久中文字幕版-黑人与欧美人视频-91久久精品人妻在线观看 | 2021中文字幕在线永久免费-欧美人妻a∨中文字幕在线-国产精品美女久久久久av毛片-久久一区二区三区蜜臀 | 超碰少妇激情v-超碰97中文字幕在线-久久久国产精品粉嫩av-精品一区二区三区四区视频区 | 国产精品久久久久aaaa竹菊-91精品国产免费久久国语打电话-激情综合网,激情五月天-熟妇高潮一区二区三区 | 国产综合精品在线观看-日本少妇人妻一级片-日韩av一二三区手机在线免费观看-日韩一区二区三区四区不卡 | 日韩一卡二卡在线视频免费观看-99久久99视频这里只有精品-久久男人久久天堂久久-国产视频一区二区免费在线播放 | 美女精品久久久久久久久久久-日本午夜激情插插插-国产成人动漫中文字幕-不卡一卡2卡3卡4卡精品在 | 久久亚洲一区二区三区舞蹈-超碰porn国产-日韩美女免费在线观看-av 日韩 中文字幕 | 色婷婷av一区二区三区麻豆-久久精品国产97欧美精品亚洲-熟妇人妻品一区二区三区视频-99久久婷婷网站 | 国产精品国产三级国产在线专50-51精产国品久久一二三a区蜜桃-欧美日韩深喉视频在线-日韩av手机在线不卡 | 国产亚洲中文字幕一区二区-超碰成人天天干-九九热久久久久热久久-超碰人妻人妻超碰在线 | 人妻少妇久久中文字幕-国产又粗又深又猛又爽的视频网站-日韩欧美中文字幕人妻第一页-思思99热re久这里有精品 | 国产精品久久久久久三级精品-国产一区二区三区激情-亚洲一区二区久久91-精品人妻一区二区三区四区六区 | 国产精品亚洲精品日韩已满十八小-丰满人妻一区二区三区免费看-91日韩中文字幕在线视频-年轻的母亲中文字幕在线看 | 久久久亚洲熟妇片-婷婷 亚洲 精品-懂色av蜜臀av粉嫩了潮喷-91免费影视在线观看 | 97超碰在线中文字幕免费观看-日韩欧美黄色在线观看-亚洲熟女少妇乱综合图片区-日韩精品欧美一线 超碰人97在线观看-18禁看黄免费亚洲-伊人色综合久久天天伊人婷-亚洲乱女色熟一区二区三区 | 久久精品在线视频系列-久久爽视频在线观看-青草青草欧美日本一区二区-色婷婷久久91精品一区二区三区 | 在线观看国产成人99-成年女人毛片免费观看不卡-亚洲人妻一区中出-日韩人妻精品免费视频 | 婷婷久久爱综合-国产不卡一区二区三区在线-久久精品一级三级-蜜臀av一区二区三区人妻少妇 | 精品人妻在线一区二区三区-又长又粗又硬又猛又高潮不断-国产久久中文字幕-久久精品中国熟妇 | 日本熟女五十路巨尻-日韩视频在线播放一区二区-黄色片黄色片黄色片亚洲黄色片-天堂网2016天堂 | 国产日本久久中文字幕-中文字幕成人免费观看-91久久精品国产原创91久久-99精品视频在线观看视频在线 | 欧美中文字幕无-久久精品久久久国产三级-久久精品久久性电影-开心激情五月天四射网 | 91成人在线观看喷-日本精品中文字幕网-久久热这里只有精品99-深夜国产福利视频在线观看 | 99精品视频在线播放观看-99热在这里只有精品99-久久久精品一区二区三区免费-国产精品久久久久久99999 | 人人妻久久人人澡人人爽人人精品-av一区二区三区人妻少妇-久久精品国产亚洲av黄瓜-色婷婷在线观看视频免费观看视频观看 | av成人中文字幕在线观看-久视频中文字幕免费在线精品-国产av系列一区二区-国产一区二区蜜臀大屁股 | 中文字幕人妻在线成人-久久色国产av-久久精品国产亚洲av麻豆软件-91麻豆精品国产福利在线观看 | 一区二区三区精品在线免费视频-久久婷婷综合色丁香-精品中文字幕高清99-激情综合开心五月激情五月 | 日韩不卡一区二区三区在线观看-中文字幕一区二区人妻精品视频-97超级碰在线精彩视频-欧美国产日韩美女被x | 欧美一区二区三区免费不卡视频-亚洲欧美情色在线观看-久久久久精品人妻一区-国产91亚洲精品久久久久 | 99网曝精品在线观看-久久精品视频这里有8-欧美va亚洲va日韩va综合-91亚洲国产三上悠亚在线 | 人妻julia丝袜中文字幕-日韩黄片中文字幕免费看片-99久久久久久精品国产-国产69久久久久9999天堂 | 精品综合久久久久久99粉芽-国产福利亚洲天堂91-丰满肥臀大屁股熟妇呻吟-亚洲欧美日韩综合在线尤物 | 91成人在线观看喷-日本精品中文字幕网-久久热这里只有精品99-深夜国产福利视频在线观看 | 9久精品久久综合久久超碰-久99精品免费视频-91久久精品国产成人久久-欧美久久久久久久久系列 | 白石茉莉奈亚洲一区二区-日韩在线视频观看不卡-久久精品国产亚洲av忘忧草18-欧美精品成人丰满人妻 | 欧美日韩在线播放一区二区不卡-国产又粗又长又爽又黄视频-日韩美女在线131mm视频-中文字幕精品丝袜亚洲 |