【发布时间】:2020-04-02 21:58:54
【问题描述】:
我正在开发撤消删除功能,它由一个小模式组成,允许用户在有限的时间内撤消/延迟操作(类似于 gmail)。但是,如果用户决定导航到另一个窗口或关闭选项卡,我想确保执行该操作,我正在这样做:
mounted() {
this.timeout = setTimeout(() => {
this.close(true);
}, this.duration);
window.addEventListener('beforeunload', this.forceDestroyHandler, { capture: true });
},
methods: {
close(deleteBeforeClosing) {
if (deleteBeforeClosing) {
clearTimeout(this.timeout);
// This is the function dispatching to the store and deleting the item
this.destructiveEvent(this.category, this.item.id);
}
this.$emit('close');
}
然后我(尝试)删除 beforeDestroy 上的事件侦听器:
beforeDestroy() {
this.forceDestroy();
window.removeEventListener('beforeunload', this.forceDestroyHandler, {capture: true});
},
但是,似乎从未调用 beforeDestroy,这意味着永远不会删除事件侦听器 - 因此,如果用户决定关闭选项卡或导航,则会提示他一条消息,即使撤消组件甚至不再显示。如果用户单击取消,则会向商店发送另一个操作,尝试删除已删除的项目,从而导致服务器错误。
我也尝试将removeEventListener 放在其他地方,但我一直遇到同样的问题。
【问题讨论】:
-
你为什么在 beforeDestroy 中调用
forceDestroy? -
forceDestroy可能不是最好的名称,但它只是关闭模式并执行删除:forceDestroy() { return this.timeout !== 0 ? this.close(true) : null; }, -
当您关闭选项卡/窗口时,组件上的
beforeDestroy()生命周期钩子永远不会被调用,因为您不是在破坏组件,而是整个选项卡窗口。 -
反转
beforeDestroy中的函数顺序 -
@ 有道理!但即使我在
close()中removeEventListener它也没有被正确删除?
标签: vue.js event-listener removeeventlistener