Electron 渲染进程之间的通信

9

菜鸟的 Electron 踩坑集锦。

对于 主进程和渲染进程之间的通信,使用 IPC 是很方便的。但是渲染进程之间呢? 哈哈,我这个码农看来又踩到一个坑了。

方案一:

使用全局共享属性:

// In the main process.
global.sharedObject = {
  someProperty: 'default value'
}
// In page 1.
require('electron').remote.getGlobal('sharedObject').someProperty = 'new value'
// In page 2.
console.log(require('electron').remote.getGlobal('sharedObject').someProperty)

但不具备事件机制,没有实质的通信功能。 当然说到这里就想起了 Node 中的全局对象了。

方案二

利用主进程做消息中转: 此方案还是很好的。

// In the main process.
ipcMain.on('ping-event', (event, arg) => {
  yourWindow.webContents.send('pong-event', 'something');
}

// In renderer process
// 1
ipcRenderer.send('ping-event', (event, arg) => {
    // do something
  }
)

// 2
ipcRenderer.on('pong-event', (event, arg) => {
    // do something
  }
)

方案三

利用 remote 接口直接获取渲染进程发送消息:

// renderer process
// get Window by ID
remote.BrowserWindow.fromId(winId).webContents.send('ping', 'someThing');

渲染进程获取 ID 就有多种方法了:

第一种: 通过 global 设置和获取
第一种是: 主进程创建事件,发送信息

// main process
win1.webContents.send('distributeIds',{
    win2Id : win2.id
});
win2.webContents.send('distributeIds',{
    win1Id : win1.id
});

第三种: 写个文件什么的都可以,方法还是多种多样的。

参考:

需要了解的 API:

你可能感兴趣的

安可 · 2018-04-09

使用 ipcRenderer.sendTo(windowId, 'ping', 'someThing') 在渲染进程中互相发送通信,更加容易

+1 回复

0

对,文章比较旧了, ipcRenderer.sendTo 在 1.8.2 新增的。有空更新下 2333

LWXYFER 作者 · 2018-04-10
0

请教一下 使用ipcRenderer.sendTo 是在指定的window中使用ipcRenderer.on('ping', () => {})接收吗

王亮つ · 2018-09-11
0

@王亮つ 是的,在created里面监听就行了

黑夜的风 · 4月26日
载入中...