我有一个使用Electron,React和React Router的应用程序。我在组件构造函数中使用ipcRenderer
将事件从我的组件发送到主要的Electron进程。在我添加了React Router之后,我注意到每次离开并回到组件时,我的ipcRenderer事件一次又一次地被添加。我认为这是因为React Router根据需要安装和卸载组件。
通过检查事件是否已经按照以下方式注册,我找到了解决问题的方法:
if (!ipcRenderer._events['open-file-reply']) {
ipcRenderer.on('open-file-reply', (event, fileContents) => {
if(fileContents){
this.setState({
data: JSON.parse(fileContents)
});
}
});
}
我只是想知道是否有更正确的方法来做到这一点。无论如何ipcRenderer.on
属于构造函数,还是有更合适的位置呢?
修改
这是我迄今为止提出的最佳解决方案:
import {ipcRenderer} from 'electron';
/* inside React component */
constructor(props) {
super(props);
// ...
this.loadFileListener = this.loadFileListener.bind(this);
ipcRenderer.on('open-file-reply', this.loadFileListener);
}
componentWillUnmount() {
ipcRenderer.removeAllListeners(['open-file-reply']);
}
loadFileListener(event, fileContents) {
// set state and stuff...
}
答案 0 :(得分:3)
我不认为你应该在安装组件之前设置IPC,所以我建议采用这种方法:
constructor(props) {
super(props)
this._loadFileListener = this._loadFileListener.bind(this)
}
componentDidMount() {
ipcRenderer.on('open-file-reply', this._loadFileListener)
}
componentWillUnmount() {
ipcRenderer.removeListener('open-file-reply', this._loadFileListener)
}