中文字幕人妻第一区-粉色视频在线-请回答1988在线观看免费观看-东北五仙电影-婷婷五月小说-小姐在线观看-色噜噜狠狠色综合-japan白嫩丰满老师videoshd-美国大片ppt大全免费观看,99国产揄拍国产精品人妻蜜,亚洲av.com,体内射精一区二区三区在线视频

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

如何移除通過$on方法動態添加的事件監聽器?

發布時間:2025-11-08 文章來源:本站  瀏覽次數:352
在 Vue 中,通過 $on 方法動態添加的事件監聽器,需要使用 $off 方法來移除。核心原則是:$off 的參數必須與 $on 完全匹配(事件名和回調函數引用一致)。以下是具體實現方法及場景示例:

一、核心用法:$off 移除特定事件監聽器

$on 用于綁定事件,$off 用于移除,兩者參數對應關系如下:
$on 綁定方式 $off 移除方式 說明
$on('eventName', handler) $off('eventName', handler) 移除指定事件的指定回調
$on('eventName', handler) $off('eventName') 移除指定事件的所有回調
$on('eventName', handler) $off() 移除組件所有事件的所有回調

二、具體場景示例

1. 移除指定事件的指定回調函數

這是常用的場景,需確保 $off 的回調函數與 $on 引用一致(不能用匿名函數)。
vue
<script>
export default {
  created() {
    // 1. 定義具名回調函數(確保引用唯一)
    this.handleClick = () => {
      console.log('自定義事件被觸發');
    };

    // 2. 用 $on 綁定事件
    this.$on('custom-click', this.handleClick);
  },
  mounted() {
    // 模擬事件觸發
    this.$emit('custom-click'); // 輸出:自定義事件被觸發
  },
  beforeDestroy() {
    // 3. 用 $off 移除指定事件的指定回調(關鍵步驟)
    this.$off('custom-click', this.handleClick);
  }
};
</script>

2. 移除指定事件的所有回調函數

若一個事件綁定了多個回調,可通過 $off('eventName') 一次性移除所有。
vue
<script>
export default {
  created() {
    // 綁定多個回調到同一事件
    this.$on('custom-event', () => console.log('回調1'));
    this.$on('custom-event', () => console.log('回調2'));
  },
  mounted() {
    this.$emit('custom-event'); // 輸出:回調1、回調2
  },
  beforeDestroy() {
    // 移除 custom-event 的所有回調
    this.$off('custom-event');
  }
};
</script>

3. 移除組件的所有事件監聽器

若需清空組件上所有通過 $on 綁定的事件,直接調用 $off() 即可(無參數)。
vue
<script>
export default {
  created() {
    this.$on('event1', () => {});
    this.$on('event2', () => {});
  },
  beforeDestroy() {
    // 移除所有事件的所有回調
    this.$off();
  }
};
</script>

4. 在子組件中移除父組件綁定的事件

父組件通過 v-on 綁定子組件的自定義事件,本質是子組件內部通過 $on 處理,子組件可在卸載時用 $off 移除。
vue
<!-- 子組件 Child.vue -->
<script>
export default {
  created() {
    // 父組件綁定的 @child-event 會被 Vue 內部轉為 $on
    // 子組件可通過 $off 移除(需知道事件名和回調)
    this.$on('child-event', this.handleChildEvent);
  },
  methods: {
    handleChildEvent() {
      console.log('子組件事件觸發');
    }
  },
  beforeDestroy() {
    this.$off('child-event', this.handleChildEvent);
  }
};
</script>

三、避坑指南

1. 匿名函數無法移除

$on 若使用匿名函數綁定,$off 無法找到相同引用,導致移除失敗。
javascript
運行
// 錯誤示例:匿名函數無法移除
this.$on('custom-event', () => console.log('匿名回調'));
this.$off('custom-event', () => console.log('匿名回調')); // 無效,引用不同

// 正確示例:用具名函數
this.handleEvent = () => console.log('具名回調');
this.$on('custom-event', this.handleEvent);
this.$off('custom-event', this.handleEvent); // 有效

2. $off 參數必須與 $on 完全匹配

若 $on 綁定了多個回調,$off('eventName', handler) 僅移除指定回調,其他回調仍有效;若需移除所有,需用 $off('eventName')

3. 組件卸載時自動清理

Vue 組件卸載時,會自動移除所有通過 $on 綁定的事件監聽器,因此若僅需在組件銷毀時移除,無需手動調用 $off。但如果組件未銷毀(如隱藏而非銷毀),則需手動移除。

4. 注意事件作用域

$on / $off 綁定的是組件實例的事件,而非 DOM 事件。若需移除 DOM 事件,仍需用 removeEventListener

總結

移除 $on 動態添加的事件監聽器,核心是:
  1. 用 $off 方法,參數與 $on 完全匹配(事件名 + 回調函數引用);
  2. 避免使用匿名函數,改用具名函數確保引用一致;
  3. 組件卸載時 Vue 會自動清理,無需手動 $off(除非組件未銷毀);
  4. 區分組件實例事件($on / $off)和 DOM 事件(addEventListener / removeEventListener)。

上一條:如何移除組件的所有事件監...

下一條:網站的規劃能夠從以下4點...