React组件构造函数

时间:2016-12-15 05:20:56

标签: reactjs react-router electron

我有一个使用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...
}

1 个答案:

答案 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)
 }