【问题标题】:Send Data from render process to renderer process in Electron在 Electron 中将数据从渲染进程发送到渲染器进程
【发布时间】:2018-05-29 16:53:15
【问题描述】:

我正在使用 Electron 开发桌面应用程序, 场景是我有 2 个浏览器窗口,从 FirstBrwoserWindow,单击按钮后我将转到 SecondBrowserWindow。我已经在 FirstBrwoserWindow 的按钮单击上实例化 SecondBrowserWindow 以避免对象已被破坏异常。
根据 Electron,如果我们想在进程之间发送数据,我们必须使用 IPC。所以实际问题从这里开始,我在 FirstBrwoserWindow 的渲染器文件中创建 SecondBrowserWindow 对象,对于 IPC,我需要在主进程中获取 SecondBrowserWindow 对象。

如何在 main.js 中获取 SecondBrowserWindow 对象并在那里使用 IPC.on????

【问题讨论】:

标签: javascript node.js electron


【解决方案1】:

我解决这个问题的方法是使用 ipcRenderer 将数据从第一个窗口传递到主进程,然后使用 ipcMain 将其传递到使用BrowserWindow.webContents.send() 的第二个窗口。

看起来有点像。

窗口 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);
});
...

【讨论】:

  • 您的方法是常规方法,当我们在主进程中实例化两个窗口时使用,在我的场景中,我在第一个窗口的渲染器进程中实例化第二个窗口。
  • 是的,但是为了让两个窗口相互通信,您必须通过主进程传递消息。渲染进程彼此不可见。
【解决方案2】:

您可以通过更多方式做到这一点,但我建议您这样做:

1) 当你收到在渲染器中打开第二个 BrowserWindow 的输入时,向 main.js 发送消息

2) 从 main.js 打开第二个 BrowserWindow 以便您可以控制它并以更简洁的方式向它发送消息。

通过这种方式,您可以关闭之前的 BrowserWindow 而不会出现通信错误,并且您可以为 N BrowserWindows 提供更可扩展可读逻辑。

【讨论】:

  • 问题是我没有在 main.js 中实例化第二个浏览器窗口,所以我无法获取它的对象来向第二个窗口发送消息。
  • 正如我所说,您必须从 main.js 实例化第二个。你怎么能那样做?而不是从第一个 BW 打开第二个 BrowserWindow (BW),您必须从第一个通过 IPC 向 main.js 发送消息,然后从 main.js 打开第二个 BW
  • 我之前做过,但问题是,当我使用关闭菜单按钮关闭该窗口并再次尝试打开它时,我得到了 Object has been Destroyed 异常。为了克服这个异常,我从 firstBrowserWindow 的按钮单击初始化第二个浏览器窗口
  • 您不能重新打开同一个 BW 对象。你必须实例化另一个并且你不会抛出异常。
  • 在某种意义上重新打开,每次都创建新对象
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 2019-10-27
  • 2017-05-01
  • 2019-02-07
  • 2017-06-01
  • 2017-10-14
相关资源
最近更新 更多