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

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

如何移除組件的所有事件監(jiān)聽(tīng)器?

發(fā)布時(shí)間:2025-11-09 文章來(lái)源:本站  瀏覽次數(shù):569
在 Vue 中移除組件的所有事件監(jiān)聽(tīng)器,需根據(jù)事件綁定方式(v-on/@$on、原生 addEventListener)針對(duì)性處理,核心思路是 “銷(xiāo)毀組件實(shí)例或批量移除所有綁定”。以下是覆蓋全場(chǎng)景的具體實(shí)現(xiàn)方法:

一、自動(dòng)移除:銷(xiāo)毀組件(徹底、推薦)

當(dāng)組件被 Vue 完全銷(xiāo)毀時(shí),會(huì)自動(dòng)清理所有通過(guò) v-on/@$on 綁定的事件監(jiān)聽(tīng)器,無(wú)需手動(dòng)操作。

1. 父組件中用 v-if 控制組件銷(xiāo)毀

vue
<!-- 父組件 -->
<template>
  <div>
    <!-- 子組件僅在 isActive 為 true 時(shí)存在 -->
    <ChildComponent v-if="isActive" />
    <button @click="destroyComponent">銷(xiāo)毀子組件(移除所有事件)</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

const isActive = ref(true);

// 銷(xiāo)毀組件:isActive 設(shè)為 false,子組件被完全銷(xiāo)毀
const destroyComponent = () => {
  isActive.value = false;
};
</script>
  • 效果:子組件銷(xiāo)毀時(shí),其內(nèi)部所有 v-on/@$on 綁定的事件會(huì)被 Vue 自動(dòng)移除,包括自定義事件和原生事件(如 @click)。
  • 適用場(chǎng)景:無(wú)需保留組件狀態(tài),僅需徹底移除組件及所有事件。

2. 用 key 強(qiáng)制重新渲染組件

若需保留組件但移除所有事件,可通過(guò)改變 key 觸發(fā)組件重新創(chuàng)建(舊組件銷(xiāo)毀,新組件初始化)。
vue
<template>
  <ChildComponent :key="componentKey" />
  <button @click="resetComponent">重置組件(移除所有事件)</button>
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

// 初始 key 為 0,點(diǎn)擊后自增
const componentKey = ref(0);

const resetComponent = () => {
  componentKey.value++; // key 變化,舊組件銷(xiāo)毀,新組件創(chuàng)建
};
</script>
  • 效果:舊組件的所有事件監(jiān)聽(tīng)器隨組件銷(xiāo)毀而移除,新組件無(wú)任何舊事件綁定。
  • 適用場(chǎng)景:需保留組件顯示,但需清空所有事件(如表單重置、狀態(tài)刷新)。

二、手動(dòng)批量移除:未銷(xiāo)毀組件時(shí)的場(chǎng)景

若組件未被銷(xiāo)毀(如僅隱藏),需手動(dòng)移除通過(guò) $on、addEventListener 綁定的事件。

1. 移除所有 $on 綁定的事件

通過(guò) this.$off()(無(wú)參數(shù))可移除組件上所有通過(guò) $on 綁定的自定義事件。
vue
<!-- 子組件 ChildComponent.vue -->
<script>
export default {
  created() {
    // 綁定多個(gè)自定義事件
    this.$on('event1', () => console.log('事件1觸發(fā)'));
    this.$on('event2', () => console.log('事件2觸發(fā)'));
  },
  methods: {
    // 手動(dòng)移除所有 $on 綁定的事件
    removeAllEvents() {
      this.$off(); // 無(wú)參數(shù):移除所有事件的所有回調(diào)
    }
  }
};
</script>
  • 效果:組件上所有通過(guò) $on 綁定的事件(如 event1、event2)被全部移除,后續(xù) $emit 觸發(fā)無(wú)效。
  • 適用場(chǎng)景:組件需保留,但需清空所有動(dòng)態(tài)綁定的自定義事件。

2. 移除所有原生 DOM 事件(addEventListener 綁定)

若通過(guò)原生 addEventListener 綁定了 DOM 事件(如 click、scroll),需批量管理并移除。
vue
<script setup>
import { onMounted, onUnmounted, ref } from 'vue';

const boxRef = ref(null);
// 存儲(chǔ)所有原生事件的配置(類(lèi)型 + 回調(diào))
const domEvents = [
  { type: 'click', handler: handleClick },
  { type: 'mousemove', handler: handleMouseMove },
  { type: 'scroll', handler: handleScroll }
];

// 定義事件回調(diào)
function handleClick() { /* ... */ }
function handleMouseMove() { /* ... */ }
function handleScroll() { /* ... */ }

// 組件掛載時(shí)綁定所有原生事件
onMounted(() => {
  domEvents.forEach(({ type, handler }) => {
    boxRef.value.addEventListener(type, handler);
  });
});

// 手動(dòng)移除所有原生事件(或在 onUnmounted 中執(zhí)行)
const removeAllDomEvents = () => {
  domEvents.forEach(({ type, handler }) => {
    boxRef.value.removeEventListener(type, handler);
  });
};

// 組件卸載時(shí)確保移除(兜底)
onUnmounted(() => {
  removeAllDomEvents();
});
</script>
  • 核心:用數(shù)組 / Map 存儲(chǔ)所有原生事件的配置,遍歷執(zhí)行 removeEventListener。
  • 適用場(chǎng)景:組件內(nèi)手動(dòng)綁定了多個(gè)原生 DOM 事件,需批量清理。

三、第三方庫(kù)事件的批量移除

若組件使用了第三方庫(kù)(如 ECharts、Mapbox),需調(diào)用庫(kù)自身的方法移除事件。
vue
<script setup>
import { onMounted, onUnmounted, ref } from 'vue';
import * as echarts from 'echarts';

const chartRef = ref(null);
let chartInstance = null;
// 存儲(chǔ)第三方庫(kù)事件配置
const chartEvents = [
  ['click', handleChartClick],
  ['legendselectchanged', handleLegendChange]
];

function handleChartClick() { /* ... */ }
function handleLegendChange() { /* ... */ }

onMounted(() => {
  chartInstance = echarts.init(chartRef.value);
  // 綁定事件
  chartEvents.forEach(([type, handler]) => {
    chartInstance.on(type, handler);
  });
});

// 批量移除第三方庫(kù)事件
const removeAllChartEvents = () => {
  chartEvents.forEach(([type, handler]) => {
    chartInstance.off(type, handler);
  });
};

// 組件卸載時(shí)銷(xiāo)毀實(shí)例(自動(dòng)移除所有事件)
onUnmounted(() => {
  removeAllChartEvents();
  chartInstance.dispose(); // 銷(xiāo)毀圖表實(shí)例,徹底清理
});
</script>
  • 關(guān)鍵:遵循第三方庫(kù)的事件管理規(guī)范(如 ECharts 的 off 方法),或直接銷(xiāo)毀實(shí)例。

四、避坑指南

  1. 區(qū)分事件綁定方式
    • v-on/@:組件銷(xiāo)毀時(shí)自動(dòng)移除,無(wú)需手動(dòng)處理;
    • $on:需手動(dòng)調(diào)用 this.$off() 移除;
    • addEventListener:需手動(dòng)調(diào)用 removeEventListener 移除。
  2. 避免遺漏第三方庫(kù)事件:第三方庫(kù)的事件(如圖表點(diǎn)擊、地圖拖拽)不會(huì)被 Vue 自動(dòng)清理,需手動(dòng)調(diào)用庫(kù)的銷(xiāo)毀 / 移除方法。
  3. 組件隱藏≠銷(xiāo)毀:用 v-show 隱藏組件時(shí),組件實(shí)例仍存在,所有事件監(jiān)聽(tīng)器有效,需手動(dòng)移除;用 v-if 銷(xiāo)毀組件才會(huì)自動(dòng)清理。
  4. 確;卣{(diào)函數(shù)引用一致:手動(dòng)移除事件時(shí)(如 removeEventListener、$off),回調(diào)函數(shù)引用必須與綁定時(shí)代一致(避免匿名函數(shù))。

總結(jié):移除所有事件監(jiān)聽(tīng)器的核心方法

事件綁定方式 移除方法 適用場(chǎng)景
v-on/@ 銷(xiāo)毀組件(v-if/key 變化) 徹底移除組件及所有事件
$on this.$off()(無(wú)參數(shù)) 組件保留,清空所有自定義事件
addEventListener 數(shù)組批量存儲(chǔ),遍歷 removeEventListener 組件保留,清空所有原生 DOM 事件
第三方庫(kù)事件 調(diào)用庫(kù)的 off 方法或銷(xiāo)毀實(shí)例 清空第三方庫(kù)綁定的事件
根據(jù)實(shí)際場(chǎng)景選擇合適的方法,即可徹底移除組件的所有事件監(jiān)聽(tīng)器,避免內(nèi)存泄漏和無(wú)效事件觸發(fā)。

上一條:在 Vue 中,如何確保...

下一條:如何移除通過(guò)$on方法動(dòng)...

日韩av欧美一区-日本久久综合久久-好好干天天日狠狠操-日本久久精品久久 | 国产极品视频一区二区三区-婷婷综合久久伊人-日韩三级av在线免费观看-1024人妻一区二区三区69 | 精品久久久久久中文三级-蜜桃久久久久精品-日韩欧美中文在线tv-国产成人亚洲综合av婷婷 | 国产欧美日韩资源在线观看-天天操夜夜操2023-日韩欧洲三级三级-91久久久久久91 | 国产aⅴ国产av在在免费线观看-精品乱码一区二区三区视频-中文字幕久久亚洲久久中文字幕-日韩精品视频在线免费观看 | 久久久久久五月婷婷丁香-欧洲精品二区三区-人人妻人人澡人人爽人人a v-日韩欧美国产一区二区三区在线观看 | 欧美日韩中文字幕精品加勒比-久热精品视频在线播放-成人免费在线观看视频网站-欧美国产日韩高清在线综合 | 91亚洲精品久久久-超碰av四十蜜桃av-婷婷97都市激情校园春色亚洲-久久久丝袜国产熟女首页 | 日本一区二区三级在线观看-丁香色区第一综合网-91精品国产91久久久久福利-亚洲码有91中文字幕 | 日本最新精品一区二区三区-欧美极品一区二区三区四区五区-日韩va亚洲va欧美va高清-熟妇人妻久久精品一区 | 日本少妇人妻久久久-蜜桃视频在线一区二区三区-亚洲精品色视频在线-亚洲人成伊人成综合网99精品 激情综合色综合久久丁香-精品久久久久女人18-av久久伊人精品中文字幕-久久久久人妻一区二区三区vr2 | 2020中文字幕在线播放-日韩免费不卡av一区-岛国在线观看av在线观看-乱色熟女综合一区二 | 中文字幕熟女人妻丝袜4k岛国-精品亚洲永久免费精-成人免费一级欧美激情-国产精品中文字幕视频在线 | 人妻中文字幕乱码系列-懂色av一区二区三区网久久-亚洲欧洲日韩第一区-在线人成免费视频97国产 | 国产一区二区三区激情视频-天天干天天日天天操天天日-91大神唐先生1080p在线-日韩精品视频亚洲在线 | 婷婷丁香花综合激情五月天-精品理论一区二区三区-国产成人叼嘿视频在线观看-少妇性视频一区二区 天天操夜夜操狠狠久久-人妻丰满熟妇a v-婷婷中文字幕综合久久-久久国产精品99国产精品72 | 久久精品国产欧美另类亚洲-伊人久久精品网站-精品99精品在线观看-久久精品露脸视频 | 最新国产精品精品视频 视频-五月天中文字幕av在线播放-成人人妻av999-超碰人人爱人看人人能97 | 国产精品久久久久久久av三级-亚洲av不卡免费在线-麻豆xx一区二区三区-蜜臀99久久国产精品久久久久久 | 亚洲婷婷激情五月天-91狠狠综合久久久久久精品网站-av在线免费观看网址入口-麻豆全部视频在线观看 | 亚州中文字幕成人在线-久久久999www-av中文 中文字幕-欧美日韩一级特黄特黄 | 成人情色av在线播放-欧美日韩国产在线高清-欧美极品欧美精品欧美图片-久久久www日本 | 大香蕉久久综合精品-麻豆免费观看高清完整视频-精品人妻一区二区免费av-久久精品超碰在线 | 91成人网在线观看-91色视频网站免费在线观看-国产又粗又爽又猛-超碰97人妻熟女 | 国产精品久久久久久三级精品-国产一区二区三区激情-亚洲一区二区久久91-精品人妻一区二区三区四区六区 | 国产精品精品久久久-国产精品久久久久粉嫩小-91熟女激情视频-国产精品99久久久久久精品人 | 天天爽夜夜爽天天操-超碰在线免费看79-丰满熟女人妻一区二区三-777午夜精品久久久 | 欧美日韩在线视频第二页-国产又粗又黄又刺激视频免费-久久精品国产96精品亚洲九色-中文字幕在线人妻av | 久久人人97超碰 少妇-色婷婷综合在线俺也去-国产精品国产三级国产aⅴ50-久久久久久久久久99蜜桃 天天干 天天曰天天操-日韩视频播放免费-久久热精品在线视频播放-91久久国产综合久久91精品视频 美女一区视频在线观看-2017av中文字幕-色婷婷色综合国产激情-激情婷婷久久久久 | 九九精选视频久久播-超碰大香蕉97-欧美日韩在线三级-欧美综合精品久久久 | 中文字幕人妻在线丝袜-国产精品午夜久久日本无删减-六月色婷婷激情综合在线网-国偷自产中文区一区一区三区 | 97精品综合久久视频-久久久久久久久久久久久久激情网-欧美日韩爱爱视频-蜜臀久久精品久久久 | 国产精品久久久69-成人国产av精品视频在线-国产综合成人久久精品91-91人妻中文字幕在线 | 国产精品亚洲精品日韩已满十八小-丰满人妻一区二区三区免费看-91日韩中文字幕在线视频-年轻的母亲中文字幕在线看 | 人妻被痴汉温泉混浴中文字幕-日韩在线欧美无裤袜-欧美精品乱码99久久蜜桃免费-日韩免费观看一码二码视频在线 | 久久老司机福利精品-精品国产乱码久久久久久竹菊影视-国产又粗又爽又猛又黄的视频-99久久亚洲精品日本无 | 欧美激情另类综合-成人97在线观看视频-日韩欧美国产综合网-婷婷国产五月天免费视频久久 | 亚洲欧美另类自拍区-超碰97在线免费观看-天天舔天天操天天插-黄色高清av网站在线观看 | 久久婷香五月综合色啪-日韩高清人妻中文字幕一区二区-亚洲熟女久久一区-亚洲中文精品人人免费 | 国产999精品久久久久久-国产 日韩 欧美高清-97超碰成人在线免费-亚洲欧美日韩另类一区 | 伊人久久在线大香蕉-亚洲精品乱码久久久久久蜜桃图-日韩97超碰熟女-日韩精品国产中文字幕 |