簡體   English   中英

無法在熱模塊更換時刪除偵聽器

[英]Cannot remove listener on Hot Module Replacement

我正在注冊一個處理程序(用於click事件)。 在注冊處理程序之前,我清除了同一處理程序,以免注冊兩個相同的處理程序。

我正在使用Webpack的熱模塊更換。 每次我更改JavaScript源代碼中的內容時,都會重新運行注冊處理程序的部分代碼。

但是,永遠不會刪除該處理程序。

export default class TaskHandlers {
    // Called from index.js
    registerAddTaskClick(addTaskElementId) {
        let element = document.querySelector(`#${addTaskElementId}`);
        if (element !== null) {
            // Never clears the handler
            element.removeEventListener('click', this.handleAddTaskClick);
            // Keeps piling on new handlers on every HMR.
            element.addEventListener('click', this.handleAddTaskClick);
        }
    }

    handleAddTaskClick(event) {
        console.log('Clicked');
    }
}

如果我手動運行element.removeEventListener() ,則僅刪除最后一個處理程序。

保存對函數的引用,以便刪除要添加的相同函數,還需要.bind(this)

export default class TaskHandlers {
    constructor() {
        this.element = document.querySelector(`#${addTaskElementId}`);
        this.handleAddTaskClick = this.handleAddTaskClick.bind(this);
    }

    // Called from index.js
    registerAddTaskClick(addTaskElementId) {
        if (this.element !== null) {
            this.element.addEventListener('click', this.handleAddTaskClick);
        }
    }

    handleAddTaskClick(event) {
        this.element.removeEventListener('click', this.handleAddTaskClick);
        console.log('Clicked');
    }
}

更新:在單擊元素時(而不是在單擊元素之前),也請刪除該元素,以使您知道該元素已經綁定了偵聽器。

可能的工作(如果它真的需要保持實例改變與HMR代碼后)解決方案是保存處理窗口對象或全局變量,是不是這就是刷新的模塊的一部分,這是不理想,但可能會做這是您的絕招,因為這是例外情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM