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

歡迎來到合肥浪訊網絡科技有限公司官網
  咨詢服務熱線:400-099-8848

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

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

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

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

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

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

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

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

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

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

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

若監(jiān)聽的是組件內的 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);

// 定義回調函數
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)回調(依賴響應式數據)

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

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

const count = ref(0);

// 用useCallback緩存回調函數,依賴變化時才重新創(chuàng)建
const handleScroll = useCallback(() => {
  // 依賴響應式數據count
  console.log('滾動時計數:', count.value);
}, [count]); // 當count變化時,函數重新創(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)鉤子中移除,回調函數通常定義在methods中以保證引用穩(wěn)定。

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

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

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

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

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

<script>
export default {
  methods: {
    handleClick(e) {
      console.log('內容區(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. 回調函數引用不一致(常見問題)

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

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

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

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

  • 問題:若組件內 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、地圖庫)時,若庫內部綁定了事件,需按其文檔調用銷毀方法。
  • 解決方案:在組件卸載時調用庫的銷毀函數,避免內部監(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);
      // 第三方庫可能內部綁定了事件
      chartInstance.on('click', (params) => { /* 處理點擊 */ });
    });
    
    onUnmounted(() => {
      // 調用庫的銷毀方法,內部會自動移除事件監(jiān)聽
      if (chartInstance) {
        chartInstance.dispose();
      }
    });
    </script>
    

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

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

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

下一條:怎樣避免前端內存泄漏?...

人妻中文字幕激情-欧美日韩日欧美日韩中-蜜臀 亚洲 一区二区三区-成年人看的视频在线观看黄 | 亚洲丰满熟妇熟女乱网-久久久久人妻一区精品下-久久久久久人妻一区二区三区-久久久久亚洲高潮 | 国产精品国产成人三级-亚洲精品乱码久久久久久黑人-97超碰亚洲人妻诱惑-天天日天天日天天天日 | 人妻不可射射一二区-9999久久久久精品中文-99热这里只有的精品视频-天天干天天干天天天天干天天 99国产人妻一区二区-亚洲欧美日韩三级在线-久久99精品久久久久久综合-国产大屁股精品视频 | 国产99视频精品免费观看9-欧美蜜臀一区二区三区-婷婷激情五月在线-97超碰亚洲天堂中文字幕网 | 大香蕉大香蕉大香蕉大香蕉-99免费在线观看精品-成人激情在线观看91-激情五月天综合精品 | 蜜桃精品一区二区三-国产又大又又粗-91精品久久久久久久99蜜桃国-国产又粗又猛又爽又黄的视频全集 | 日韩精品深夜视频-日韩 欧美一区二区三区-亚洲伊人久久综合网av-免费观看日韩毛片. | 久久er99视频精品-日韩一道本高清av-午夜精品久久99蜜桃的功能介绍-精品av一区二区三区四区 | 中文字幕成人精品一区-日韩 亚洲 欧美 综合-麻豆午夜在线视频-国产成人99在线播放 | 中文字幕精品熟女久久久-av日韩中文字幕电影-国产精品免费精品自在线观看-亚洲乱熟女一区二区三区在线视频 | 成人免费中文字幕电影-有码中文字幕视频-国产精品人人做人人-99亚洲综合成人精品久久久 | 日韩欧美黄片网址-日韩高清在线综合一区-日韩精品中文字幕高清在线-加勒比一本色道久久综合亚洲精品 | 日韩熟妇中文字幕-国产欧美亚洲一区二区-少妇毛片一区二区三区色哟哟-91人妻丝袜美腿一区二区 | 99国产精品欲av在线-国产精品欧美久久久久久-久久综合亚洲鲁鲁五月久久-91精品国产乱码久久久久久久久 | 国产欧美日韩资源在线观看-天天操夜夜操2023-日韩欧洲三级三级-91久久久久久91 | 人妻伦伦精品一区二区三区在线看-婷婷亚洲第一页-精品乱子伦一区二区三区-亚洲国产日韩御姐 | 97国产人妻一区二区三区-国内精品一区二区三区久-91 中文字幕在线观看-欧美日韩亚洲中文字幕 | 国产亚洲精品久久久久久无几年桃-超碰国产情侣自拍-国产精品 亚洲欧洲-91麻豆国产最新在线观看 | 在线观看国产成人99-成年女人毛片免费观看不卡-亚洲人妻一区中出-日韩人妻精品免费视频 | 亚洲成年人在线观看-日韩一区二区三区四-日韩3p伦理片在线播放-日韩三十路人妻 | 91超精品碰国产在线观看-91人精品久久久久久久久-日韩老熟妇精品-久久在线视频首页 | 日韩高清毛片网站-精品久久久久久久高潮-久久国产亚洲欧美人成-国产中文字幕xx99av | 亚洲va国产va欧美精品88-91丨九色丨农村老熟女按摩-日韩限制级影院-97人妻超碰在线免费 | 国产成人啪精品视频免费网站下载-91精品少妇高潮一区-中文字幕人妻一区二区三区在线-久久精品国产亚洲av桃花av | 人人妻人人澡人人爽久久av网站-av中文字幕网一区-日韩欧美一区二区三区国产-麻豆91精品91久久 | 国产精品久久久久精品艾秋-免费人妻av一区二区三区-久久精品—区二区三区-久久久国产这里有的是 在线日韩制服中文字幕-亚洲欧美日韩顶级片-日韩中文有码免费视频-一区二区三区四区高清av | 神马午夜久久久av-中文日韩av在线免费观看-日韩欧美一级一区二区-国产激情在线视频免费 | 国产成人精品视频网站-国产三级男人的天堂-蜜臀aⅴ人妻一区二区三区-国产麻豆剧传媒精品国产av | 久久五月婷婷之激情综合-国产乱子伦一区二区三区网-九九99久久精品少妇-91狠狠综合久久久久久精品 | 91欧美精美久久久-岛国高清中文字幕av-日韩色视频在线免费观看-懂色a精品欧美日韩懂色 | 91久久国产综合久久久久蜜月-91精品国产高久久久久久69-热re99久久6国精品免费地址-日韩av精品夜夜网站 | 91精品国产综合久久久久久婷婷-久久久亚洲精品三级-日韩激情久久五月天-日韩中文人妻av | 欧美人妻一区二区三区视频-91桃色一区二区亚洲熟-中文字幕日韩av在线观看-99人妻超碰在线 | 91人妻人人澡人人爽人人稍精品-日韩精品深夜久久久久久-久久精品国产亚洲av一卡二卡-久久人妻一区二区三区四区 | 精品综合久久久久久99粉芽-国产福利亚洲天堂91-丰满肥臀大屁股熟妇呻吟-亚洲欧美日韩综合在线尤物 | 麻豆人妻换人妻69xx-亚洲成a人在线观看-日韩色综合日韩色综合-超碰国语对白自拍 | 日本人妻精品久久久-天天干bb夜夜操bb-成人精品一区二区三区校园激情-91精品国产综合久久久久白拍 | 亚洲国产欧美在线人成aⅴ-国色天香精品二区三区-久日视频在线观看免费-91精品久久久久精品一区 | 国产又大又长又粗又硬视频-青草精品视频在线中文字幕-麻豆综合视频在线观看-99热这里只有精品9999 | 国产99视频精品免费观看9-欧美蜜臀一区二区三区-婷婷激情五月在线-97超碰亚洲天堂中文字幕网 |