我正在尝试在我的应用程序中的某些时间从本地数据库文件加载/更新数据。这个文件当然必须从主进程访问,所以我从渲染器发送到主进程,然后当主进程返回我需要的数据时,我需要运行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)); }
});
}
}
答案 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));
});
}
}