【发布时间】:2020-02-10 12:34:13
【问题描述】:
我刚刚遇到了一个与 Vue 指令中的事件监听相关的问题。 我有一个包含以下代码的组件:
function setHeaderWrapperHeight() { ... }
function scrollEventHandler() { ... }
export default {
...
directives: {
fox: {
inserted(el, binding, vnode) {
setHeaderWrapperHeight(el);
el.classList.add('header__unfixed');
window.addEventListener(
'scroll',
scrollEventListener.bind(null, el, binding.arg)
);
window.addEventListener(
'resize',
setHeaderWrapperHeight.bind(null, el)
);
},
unbind(el, binding) {
console.log('Unbound');
window.removeEventListener('scroll', scrollEventListener);
window.removeEventListener('resize', setHeaderWrapperHeight);
}
}
}
...
}
每次更改路由器路径时都会重新渲染此组件,我通过将当前路由路径分配给:key prop 来实现此行为,因此每当路径更改时,它都会重新渲染。但是问题是尽管事件侦听器没有被删除/销毁,导致可怕的性能问题。那么如何移除事件监听器呢?
【问题讨论】:
-
尝试在组件的 destroyed 生命周期钩子中删除事件监听器,而不是从指令中删除,
-
@DigitalDrifter 仍然得到相同的结果
-
@DigitalDrifter 是的,我正在使用 VueRouter,因为已经发现问题更多的是 javascript,因此在函数上调用
bind()创建了新函数,因此 removeEventListener 得到了错误的函数引用。谢谢!
标签: javascript vue.js vue-directives