在 Vue 中使用带有 Webpack 热重载的 mitt-library 会导致问题吗?

Using the mitt-library in Vue with Webpack hot-reload causes problems?

在我的 Vue3 应用程序中,我使用 mitt 事件总线库在组件之间发出和接收事件。

我把它放在需要刷新的列表组件的 onMounted 中:

  mitt.on("list_refresh", (evt) => {
    refresh();
  });

在另一个包含列表组件作为子(或孙)组件的组件中,我在一个方法中执行此操作:

  mitt.emit("list_refresh", {});

这工作正常,但是在使用 hot-reload 进行开发时,事件似乎会发出多次,就好像每次重新加载应用程序时都会额外创建它们一样,而不是覆盖旧事件。 当我在浏览器中重新加载整个页面时,它再次正常工作。

有什么办法可以防止这种情况发生吗?

您的组件似乎缺少相应的 off() call to remove the event listener. During hot reload, the current component instances unmount, and new ones mount; so if you're not removing current event listeners, you'll just pile on new event listeners. To resolve the issue, use the onUnmounted hook 以在组件从 DOM 中删除时删除事件侦听器。

此外,确保将 缓存函数引用 (而不是内联函数)传递给 mitt.on()mitt.off() 以确保给定的事件侦听器查找成功在 mitt.off():

// mitt.on('list_refresh', () => refresh()) ❌

mitt.on('list_refresh', refresh) ✅
mitt.off('list_refresh', refresh)

您的 setup() 应该类似于:

import { onMounted, onUnmounted } from 'vue'

export default {
  setup() {
    const refresh = () => { /*...*/ }

    onMounted(() => mitt.on('list_refresh', refresh))
    onUnmounted(() => mitt.off('list_refresh', refresh)) 
  }
}