将函数传递给ipcMain并使用React,Redux,Electron返回的解决方法

时间:2016-09-04 01:43:23

标签: reactjs redux electron

我正在尝试在我的应用程序中的某些时间从本地数据库文件加载/更新数据。这个文件当然必须从主进程访问,所以我从渲染器发送到主进程,然后当主进程返回我需要的数据时,我需要运行Redux的调度来相应地更新我的状态。问题是我的ipcRenderer.on()侦听器没有正确调用dispatch的上下文。我尝试将函数传递给主进程,然后返回到渲染器,但函数从ipcRenderer.send中删除。

从主流程收到数据后,如何才能正确更新状态?在我的代码的孤立块下面。

主要流程:

ipcMain.on('getSites', (event, args) => {
  db.sites.find({}, (err, docs) => {
    event.sender.send('getSitesSuccess', { data: docs, dispatch: args.dispatch });
  });
});

渲染过程:

ipcRenderer.on('getSitesSuccess', (event, args) => {
  args.dispatch(args.data);
});

class SiteList extends Component {
  componentWillMount() {
    ipcRenderer.send('getSites', {
      test: 'test',
      dispatch: (data) => { this.props.dispatch(actions.change('sites', data)); }
    });
  }
}

2 个答案:

答案 0 :(得分:2)

确保在类实例(app.get('/crud', function(req, res) { // call passing in a callback db.users.retrievePost(function(err,result) { // call render inside this call back, after result has been retrieved res.render('crud', {user: req, user, posts: result}); }) }); // Retrieve posts from database to pass to view. exports.retrievePost = function(callback) { var cursor = postsCollection.find().toArray(function(err, record) { console.log(record); // naively just invokes the passed callback // you could also do error handling or other processing // here as well, before passing back the result through the callback callback(err,record); }); } )中设置事件侦听器。此外,确保在实例处置(componentDidMount)后正确处置任何事件侦听器。

componentWillUnmount

如果您正在进行大量ipc调用(包括接收和发送),请查看class SiteList extends Component { componentDidMount() { ipcRenderer.on('getSitesSuccess', this.handleSitesSuccess); } componentWillUnmount() { ipcRenderer.removeListener('getSitesSuccess', this.handleSitesSuccess); } handleSitesSuccess(event, args) { console.log('data', args.data); props.dispatch(actions.change('sites', args.data)); } } link)。这将从实际组件中删除ipc调用的连接逻辑,并允许您直接使用redux状态。

注意:我是这个插件的作者。

答案 1 :(得分:0)

我不确定这是否是最佳方法,但事实证明重构我的代码有点是解决方案。我没有在我的组件之外使用ipcRenderer.on,而只需要将它嵌套在组件的构造函数中。希望这可以帮助将来的某个人。

class SiteList extends Component {
  constructor(props, context) {
    super(props, context);

    ipcRenderer.on('getSitesSuccess', (event, args) => {
      console.log('data', args.data);
      props.dispatch(actions.change('sites', args.data));
    });
  }
}