【问题标题】:how to remove an event listener in vue 3 correctly如何正确删除 vue 3 中的事件监听器
【发布时间】:2021-04-08 14:18:41
【问题描述】:

我有一个事件监听器,它在项目安装时和每次调整大小事件后获取视口尺寸。

我不知道如何正确移除事件监听器。

const { createApp, onMounted, ref } = Vue;
const app = createApp({
  setup() {
    const dim = ref({})
    
    onMounted(() => {
      dim.value = getDimensions()
      // adding the event listener...
      window.addEventListener('resize', debounce(() => {
        // ...but how to remove the event listener correctly?
        console.log('resize')
        dim.value = getDimensions()
      }, 250))
    })
    
    function getDimensions () {
      return {
        w: window.innerWidth,
        h: window.innerHeight
      }
    }
    
    // generic debounce function
    function debounce (func, wait) {
    let timeout
    return function executedFunction (...args) {
      const later = () => {
      timeout = null
          func(...args)
        }
        clearTimeout(timeout)
        timeout = setTimeout(later, wait)
      }
    }

    return {
      dim
    }
  }
});
app.mount("#app");
.navbar {
  position: fixed;
  width: 100%;
  height: 50px;
  top: 0;
  left: 0;
  background-color: #555;
  text-align: center;
}
p {
    color: #fff;
}
<script src="https://unpkg.com/vue@next"></script>

<div id="app">
  <div class="navbar">
    <p>
      <span>width: {{ dim.w + ' ' }}</span>
      <span>| height: {{ dim.h }}</span>
    </p>
  </div>
</div>

如何移除事件监听器?

我正在使用 Vue 3 和组合 API。

【问题讨论】:

    标签: vue.js event-listener vuejs3 vue-composition-api removeeventlistener


    【解决方案1】:

    为什么不在 unmounted 生命周期挂钩 (docs) 中

    window.removeEventListener("resize", debounce);
    

    对于 Vue 3 组合 API,相应的钩子是 onUnmounted(请参阅 docs

    【讨论】:

    • 确保传递debounce() 的结果(传递给addEventListener 的同一实例),而不是debounce 本身。
    • @tony19 - 这是一般的注释还是我应该改变一些东西?
    • 是的,需要进行更改。缓存debounce的结果,传递给addEventListenerremoveEventListener
    【解决方案2】:

    我通常在mounted之外定义我的事件方法

    onResize() {
        debounce(() => {
            // ...but how to remove the event listener correctly?
            console.log('resize')
            dim.value = getDimensions()
          }, 250))
        })
    }
    

    然后在mounted里面就可以使用了

    onMounted(() => {
      dim.value = getDimensions()
      // adding the event listener...
      window.addEventListener('resize', this.onResize)
    })
    

    在 beforeUnmount 内部

    beforeUnmount(() => {
      window.removeEventListener('resize', this.onResize)
    })
    

    【讨论】:

    • 他正在使用 vue3,他们改变了钩子
    猜你喜欢
    • 2015-02-27
    • 2018-05-15
    • 2022-10-13
    • 2017-01-16
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    相关资源
    最近更新 更多