我有一个使用 react(遗留代码)构建的扩展,并且我一直在跟踪一个我最终解决的错误,但我无法修复。
当扩展的图标(在浏览器栏中)被点击时,一个 reactComponent被创建,并且一个监听器被添加到它的componentDidMount():
async componentDidMount(){
...
// an object from the background is retrieved
let background_object = this.props.getBackgroundObject();
...
// code including await background_object.doSomething();
...
// add event (eventemitter3 is used for the event management)
background_object.event.on('onMusic', this.dance);
...
}
async dance() {
this.setState({
'music': true,
})
}
但是,我无法弄清楚如何在Component消失后删除侦听器,例如通过单击浏览器中的其他位置。我以为这componentWillUnmount就是我要找的东西,但它从未被称为:
componentWillUnmount(){
// this is never called!!!
background_object.event.removeListener('onDance', this.dance);
}
问题是,每次我打开(和关闭)扩展弹出窗口时,都会向 中添加一个新事件background_object,因此会dance()多次调用(与打开和关闭弹出窗口一样多)。
现在,我使用了once代替on:
async componentDidMount(){
...
// an object from the background is retrieved
let background_object = this.props.getBackgroundObject();
...
// code including await background_object.doSomething();
...
// add event (eventemitter3 is used for the event management)
background_object.event.once('onMusic', this.dance);
...
}
async dance() {
// add the event again in case onMusic is called again
background_object.event.once('onMusic', this.dance);
this.setState({
'music': true,
})
}
这样,至少,它只被调用了一次。但是,我担心我的组件被多次创建并消耗浏览器中的内存。
我如何确保组件实际上正在被销毁?如何检测弹出窗口何时关闭以删除事件?
收到一只叮咚
相关分类