Javascript 将数据从渲染进程发送到Electron中的渲染进程
我正在使用Electron开发桌面应用程序, 场景是我有两个BrowserWindow,从第一个BrowserWindow,我将在点击按钮后转到第二个BrowserWindow。我已在FirstBrwoserWindow的按钮单击上实例化了SecondBrowserWindow,以避免对象被销毁异常。Javascript 将数据从渲染进程发送到Electron中的渲染进程,javascript,node.js,electron,Javascript,Node.js,Electron,我正在使用Electron开发桌面应用程序, 场景是我有两个BrowserWindow,从第一个BrowserWindow,我将在点击按钮后转到第二个BrowserWindow。我已在FirstBrwoserWindow的按钮单击上实例化了SecondBrowserWindow,以避免对象被销毁异常。 根据Electron的说法,如果我们想在进程之间发送数据,就必须使用IPC。所以实际问题从这里开始,我在FirstBrwoserWindow的渲染器文件中创建SecondBrowserWindow
根据Electron的说法,如果我们想在进程之间发送数据,就必须使用IPC。所以实际问题从这里开始,我在FirstBrwoserWindow的渲染器文件中创建SecondBrowserWindow对象,对于IPC,我需要在主进程中获取SecondBrowserWindow对象
如何在main.js中获取SecondBrowserWindow对象并在其中使用IPC.on???我解决这一问题的方法是使用ipcRenderer将数据从第一个窗口传递到主进程,然后使用
BrowserWindow.webContents.send()将数据通过ipcMain传递到第二个窗口
看起来有点像这样
窗口1
...
// Emit an ipc message with your data
ipcRenderer('your-message', { foo: 'bar' });
...
主流程
...
let window1 = new BrowserWindow(...);
let window2 = new BrowserWindow(...);
...
// when ipc message received pass it on to second window object with webContents
ipcMain.on('your-message', (event, payload) => {
window2.webContents.send('your-relayed-message', payload);
});
...
窗口2
...
// when ipc messaged received in second window do what you want with the data
ipcRenderer.on('your-relayed-message', (event, payload) => {
console.log(payload);
});
...
你可以用更多的方法来做,但我建议你:
1) 当您收到在渲染器中打开第二个浏览器窗口的输入时,向main.js发送消息
2) 从main.js打开第二个浏览器窗口,这样您就可以控制它并以更干净的方式向它发送消息
通过这种方式,您可以关闭上一个BrowserWindow,而不会出现通信错误,对于N个BrowserWindow,您有一个更具可伸缩性和可读性的逻辑。您的方法是常规方法,即在主进程中实例化两个窗口时使用的方法,在我的场景中,我将在第一个窗口的渲染器进程中实例化第二个窗口。是的,但是为了让两个窗口相互通信,您必须通过主进程中继消息。渲染进程彼此不可见。问题是我没有在main.js中实例化第二个BrowserWindow,所以我无法让它的对象将消息发送到第二个窗口。正如我所说,您必须从main.js实例化第二个BrowserWindow。你怎么能做到?与从第一个浏览器窗口打开第二个浏览器窗口(BW)不同,您必须从第一个浏览器窗口通过IPC向main.js发送消息,然后从main.js打开第二个浏览器窗口。我之前已经这样做了,但问题是,当我使用“关闭”菜单按钮关闭该窗口并再次尝试打开它时,我得到的对象已被销毁。为了克服此异常,我从firstBrowserWindow的按钮单击初始化了第二个browserwindow。您不能重新打开同一个BW对象。您必须实例化另一个对象,并且不会抛出异常。从某种意义上讲,重新打开,每次查看此解决方案时都会创建新对象