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

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

如何在 Vue 中移除原生 JavaScript 事件監(jiān)聽(tīng)器?

發(fā)布時(shí)間:2025-11-10 文章來(lái)源:本站  瀏覽次數(shù):440
在 Vue 中移除原生 JavaScript 事件監(jiān)聽(tīng)器(即通過(guò) addEventListener 綁定的事件),核心原則與原生 JS 一致:在組件合適的生命周期鉤子中,使用 removeEventListener 移除,且確保事件類型、回調(diào)函數(shù)引用、捕獲階段參數(shù)與綁定時(shí)代完全匹配。以下是針對(duì) Vue 3 和 Vue 2 的具體實(shí)現(xiàn)方法及避坑指南:

一、核心前提:確保綁定與移除的參數(shù)完全一致

移除原生事件監(jiān)聽(tīng)器的關(guān)鍵是 “參數(shù)三匹配”:
  1. 事件類型(如 click、scroll)一致;
  2. 回調(diào)函數(shù)引用一致(不能用匿名函數(shù));
  3. 捕獲階段參數(shù)(useCapture,默認(rèn) false)一致。
錯(cuò)誤示例(匿名函數(shù)無(wú)法移除):
javascript
運(yùn)行
// 綁定匿名函數(shù),引用不唯一
boxRef.value.addEventListener('click', () => console.log('點(diǎn)擊'));
// 移除時(shí)找不到相同引用,無(wú)效
boxRef.value.removeEventListener('click', () => console.log('點(diǎn)擊'));
正確示例(具名函數(shù)確保引用一致):
javascript
運(yùn)行
// 定義具名函數(shù)
function handleClick() {
  console.log('點(diǎn)擊');
}
// 綁定
boxRef.value.addEventListener('click', handleClick);
// 移除(參數(shù)完全匹配)
boxRef.value.removeEventListener('click', handleClick);

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

Vue 3 中需通過(guò) ref 獲取 DOM 元素引用,在組件掛載時(shí)綁定事件,在卸載前(onUnmounted)移除,確保組件銷毀時(shí)事件被清理。

1. 基礎(chǔ)用法:移除組件內(nèi) DOM 元素的原生事件

vue
<template>
  <div ref="box" class="box">點(diǎn)擊或移動(dòng)鼠標(biāo)</div>
</template>

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

// 1. 獲取 DOM 引用
const box = ref(null);

// 2. 定義具名回調(diào)函數(shù)(確保引用唯一)
function handleClick() {
  console.log('盒子被點(diǎn)擊');
}

function handleMouseMove(e) {
  console.log('鼠標(biāo)位置:', e.clientX, e.clientY);
}

// 3. 組件掛載時(shí)綁定事件
onMounted(() => {
  if (box.value) {
    box.value.addEventListener('click', handleClick); // 綁定 click
    box.value.addEventListener('mousemove', handleMouseMove); // 綁定 mousemove
  }
});

// 4. 組件卸載時(shí)移除所有事件(關(guān)鍵步驟)
onUnmounted(() => {
  if (box.value) {
    box.value.removeEventListener('click', handleClick);
    box.value.removeEventListener('mousemove', handleMouseMove);
  }
});
</script>

<style>
.box { width: 200px; height: 200px; background: #eee; }
</style>

2. 處理捕獲階段的事件移除

若綁定事件時(shí)使用了捕獲階段(addEventListener 第三個(gè)參數(shù)為 true),移除時(shí)必須傳入相同參數(shù):
javascript
運(yùn)行
onMounted(() => {
  // 綁定捕獲階段的 click 事件
  box.value.addEventListener('click', handleClick, true);
});

onUnmounted(() => {
  // 移除時(shí)必須傳入第三個(gè)參數(shù) true,否則無(wú)效
  box.value.removeEventListener('click', handleClick, true);
});

3. 批量移除多個(gè)原生事件

若組件內(nèi)綁定了多個(gè)原生事件,可通過(guò)數(shù)組批量管理,遍歷移除:
vue
<script setup>
import { onMounted, onUnmounted, ref } from 'vue';

const box = ref(null);

// 存儲(chǔ)所有原生事件配置(類型 + 回調(diào) + 捕獲階段)
const domEvents = [
  { type: 'click', handler: handleClick, useCapture: false },
  { type: 'mousemove', handler: handleMouseMove, useCapture: false },
  { type: 'mouseleave', handler: handleMouseLeave, useCapture: true }
];

function handleClick() { /* ... */ }
function handleMouseMove() { /* ... */ }
function handleMouseLeave() { /* ... */ }

onMounted(() => {
  if (box.value) {
    domEvents.forEach(({ type, handler, useCapture }) => {
      box.value.addEventListener(type, handler, useCapture);
    });
  }
});

onUnmounted(() => {
  if (box.value) {
    domEvents.forEach(({ type, handler, useCapture }) => {
      box.value.removeEventListener(type, handler, useCapture);
    });
  }
});
</script>

三、Vue 2(選項(xiàng)式 API):在 beforeDestroy 中移除

Vue 2 中通過(guò) $refs 獲取 DOM 元素,在 mounted 中綁定事件,在 beforeDestroy 中移除,回調(diào)函數(shù)定義在 methods 中確保引用穩(wěn)定。

1. 基礎(chǔ)用法

vue
<template>
  <div ref="box" class="box">點(diǎn)擊我</div>
</template>

<script>
export default {
  methods: {
    // 回調(diào)函數(shù)定義在 methods 中,引用唯一
    handleClick() {
      console.log('盒子被點(diǎn)擊');
    }
  },
  mounted() {
    // 組件掛載后綁定事件
    this.$refs.box.addEventListener('click', this.handleClick);
  },
  beforeDestroy() {
    // 組件銷毀前移除事件(關(guān)鍵)
    this.$refs.box.removeEventListener('click', this.handleClick);
  }
};
</script>

2. 處理動(dòng)態(tài) DOM 元素的事件移除

若 DOM 元素通過(guò) v-if 控制顯示 / 隱藏,需在元素銷毀前(如 beforeDestroy)判斷元素是否存在,避免報(bào)錯(cuò):
javascript
運(yùn)行
beforeDestroy() {
  // 先判斷 DOM 是否存在,再移除事件
  if (this.$refs.box) {
    this.$refs.box.removeEventListener('click', this.handleClick);
  }
}

四、避坑指南:常見(jiàn)錯(cuò)誤與解決方案

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

  • 問(wèn)題:綁定匿名函數(shù)或動(dòng)態(tài)創(chuàng)建的函數(shù),導(dǎo)致 removeEventListener 找不到相同引用。
  • 解決方案:始終使用具名函數(shù)(如 function handleClick())或在組件實(shí)例上保存函數(shù)引用(如 Vue 2 的 methods、Vue 3 的 setup 內(nèi)定義)。

2. 遺漏捕獲階段參數(shù)

  • 問(wèn)題:綁定事件時(shí)用了 useCapture: true,移除時(shí)未傳入,導(dǎo)致移除失敗。
  • 解決方案:移除時(shí)嚴(yán)格保持 useCapture 參數(shù)與綁定一致。

3. 組件卸載時(shí) DOM 已不存在

  • 問(wèn)題:組件內(nèi) DOM 通過(guò) v-if 銷毀,或組件卸載時(shí) DOM 已被移除,此時(shí)調(diào)用 removeEventListener 會(huì)報(bào)錯(cuò)。
  • 解決方案:移除前先判斷 DOM 元素是否存在(如 if (box.value))。

4. 混淆 Vue 指令與原生事件

  • 問(wèn)題:通過(guò) Vue 的 @click 綁定的事件,無(wú)需手動(dòng)移除(Vue 會(huì)自動(dòng)清理),但如果同時(shí)用 addEventListener 綁定了相同事件,需手動(dòng)移除。
    vue
    <template>
      <!-- Vue 指令綁定的事件:自動(dòng)移除 -->
      <button @click="vueClick">Vue 指令點(diǎn)擊</button>
      <!-- 原生 addEventListener 綁定的事件:需手動(dòng)移除 -->
      <button ref="nativeBtn">原生事件點(diǎn)擊</button>
    </template>
    

總結(jié):Vue 中移除原生 JS 事件監(jiān)聽(tīng)器的核心步驟

  1. 綁定階段:用 ref(Vue 3)/$refs(Vue 2)獲取 DOM 引用,使用具名函數(shù)通過(guò) addEventListener 綁定事件,記錄事件類型、回調(diào)、捕獲階段參數(shù)。
  2. 移除階段:在組件卸載鉤子(onUnmounted Vue 3 /beforeDestroy Vue 2)中,通過(guò) removeEventListener 移除事件,確保參數(shù)與綁定完全一致。
  3. 兜底處理:移除前判斷 DOM 是否存在,避免報(bào)錯(cuò);批量事件通過(guò)數(shù)組管理,遍歷移除提高效率。
遵循以上步驟,可徹底避免原生事件監(jiān)聽(tīng)器殘留導(dǎo)致的內(nèi)存泄漏問(wèn)題。

上一條:如何確保第三方庫(kù)事件綁定...

下一條:如何移除通過(guò)$emit觸...

91免费版黄色下载-精品亚洲成a人7777在线观看-欧美日韩夜夜摸综合视频-欧美熟女人妻在线 | 日韩熟女中文网-欧美一区二区三区网-国产精品18禁久久久久久白浆-久久的爱久久的你在线免费观看 97久久精品人人人妻人人1-久久这里只有精品18岁-日韩成人自拍视频在线-人妻少妇被猛烈插入中文字幕 | 久久久亚洲熟妇熟女1000部-六月婷婷,中文字幕-欧美黑人精品在线视频-中文字幕日产av最新 | 91大神视频免费在线播放-精品久久国产乱码欠精品-国产精品久久久久久久久久人妻-嫩草伊人久久精品少妇av | 亚洲av中文高清中文-一道本一区二区久久久久久久-日韩 亚洲 第1页-超碰免费在线7 | 国产精品永久久久久久久久-久热这里只有精品视频99-julia人妻一区二区三区-超碰av在线影院 | 欧美日韩国产精品第一-91精品91九九九久久久-色婷婷亚洲五月天在线观看-成年av网站18禁 | 久久久性生活视频-99久久免费国产精品四虎-色婷婷在线视频色婷-日韩小说中文字幕 | 久久久月婷婷天天操天天操-老熟女一区二区在线-91精品国产老熟女系列碰碰-日韩欧美激情视频一二三区 | 欧美日韩亚洲视频不卡-久久综合色——久久综合色88-久久99中文字幕-日本熟女久久综合 | 久久手机视频91制片厂-国产 日韩 欧美 自拍-蜜桃久久人妻一区二区-一区二区人妻乳中文字幕 | 亚洲欧美日韩欧美国产精品-狠狠人妻久久久久久综合密桃-在线观看日韩小视频-久久精品视频17 | 日韩三级在线视频-日韩人妻熟女在线-国产又黄又粗又猛视频-欧美日韩亚洲视频在线观看 | 99国产区二区视频在线观看-精品久久久999久久久-日韩欧美一区二区三区四区五区-久久久久国产精品一级黄片 | 国产综合精品在线观看-日本少妇人妻一级片-日韩av一二三区手机在线免费观看-日韩一区二区三区四区不卡 | 大白屁股一区二区熟女少妇-国产又粗又长又爽免费-久久思思这里只有精品-av一区二区三区骚 | 色婷婷av一区二区三区麻豆-久久精品国产97欧美精品亚洲-熟妇人妻品一区二区三区视频-99久久婷婷网站 | 欧美日韩色帝国-二区三区四区中文字幕-国产欧美日韩一区二区国内-91久久精品人妻一区二区三 | 久久精品熟女俱乐部-国产一区二区三区福利-好好热在线观看视频-国产又粗又长又大又圆视频 | 亚洲五月天伊人久久-国产精品久久高潮呻吟无-日韩五十路毛片-91精品久久久久久久久久精 | 麻豆玩弄japan白嫩少妇hd-91旷世极品尤物 系列-日韩黄色中文字幕电影网站-国产成人亚洲综合亚洲 久久久熟妇色综合激情-天天爽天天操天天做天天干-91麻豆精品国产理论片在线观看-久久热这里都是精品 | 中文字幕精品熟女久久久-av日韩中文字幕电影-国产精品免费精品自在线观看-亚洲乱熟女一区二区三区在线视频 | 欧美精品久久久蜜桃-欧美一区二区三区人妻少妇-成人av 在线观看-欧美1区2区在线观看 | 2012中文字幕高清免费看-国产婷婷在线一区不卡-女同av一区二区三区-日韩专区欧美激情 | 成人免费av一区二区三区-天天爽天天少妇高潮-好好的日视频com-69久久夜色精品国产69乱粉嫩 | 久久夜亚洲一区-欧美人妻369你懂的视频-日韩在线视频观看三区-日韩中文字幕91在线看 | 亚洲欧美日韩图色-欧美,日韩,国产第三页-国产成人一区二区在线-久久亚洲日本人妻 | 岛国av在线播放视频-在线免费观看中文字幕2021-欧美巨大性爽欧美精品一-丁香色婷婷综合激情 | 国产aⅴ国产av在在免费线观看-精品乱码一区二区三区视频-中文字幕久久亚洲久久中文字幕-日韩精品视频在线免费观看 | 婷婷六月丁香网-成人超碰色偷偷av-人妻熟妇久久久久久精品一区-国产亚洲精品成人久久网站 | 欧美中文字幕无-久久精品久久久国产三级-久久精品久久性电影-开心激情五月天四射网 | 久久人人97超碰 少妇-色婷婷综合在线俺也去-国产精品国产三级国产aⅴ50-久久久久久久久久99蜜桃 天天干 天天曰天天操-日韩视频播放免费-久久热精品在线视频播放-91久久国产综合久久91精品视频 美女一区视频在线观看-2017av中文字幕-色婷婷色综合国产激情-激情婷婷久久久久 | 人妻丰满熟妇乱又伦-黑人强壮的爱爱视频-欧美国产日韩一区二区三区-日韩精品五十熟 | 美日韩人妻久久黄片.-51国偷自产一区二区三区-国产熟妇另类久久久久91-亚洲av日韩日韩av一区二区三区 | 99久久久免费精品国产-成人午夜aaaa片-成人国产一区在线观看-婷婷久久一婷婷 | 久久韩国主播青草-日韩美亚洲av电影-国产精品成人三级网站-国精产品一区二区三区区别 | 日本中文字幕人妻秘书-999精品免费视频-国产乱码久久久久久久久久-成人免费av小视频 | 国产91精品免费看-97精品国产91久久-91久久国产精品综合-91精品欧美久久久久激情视频 | 国产99久9在线视频-日韩中文字幕一级黄片免费看-黑人中文字幕在线观看-国产精品久久精品免费 | 91免费在线啪啪啪-久久99青青精品免费观看-久久91精品久久-精品一区二区三区产品免费久久 | 中文字幕国产精品av-亚洲精品日韩欧美偷拍-日韩欧美丝袜美腿中文字幕-日日噜噜夜夜狠狠久久香91 日韩av东京热电影-丰满人妻一区二区二区53视频-久久丝袜一区二区三区-国产熟女一区二区三 |