Electron学习笔记之主进程与渲染进程通信

1,610 阅读2分钟

Electron 主进程和渲染进程通信

111.jpg

有时候我们想在渲染进程中通过一个事件去执行主进程里面的方法。或者在渲染进程中通知主进程处理事件,主进程处理完成后广播一个事件让渲染进程去处理一些事情。这个时候就用到了主进程和渲染进程之间的相互通信。

Electron 主进程和渲染进程的通信主要用到两个模块:ipcMainipcRenderer

ipcMain:当在主进程中使用时,它处理从渲染器进程(网页)发送出来的异步和同步信息,当然也有可能从主进程向渲染进程发送消息。

ipcRenderer: 使用它提供的一些方法从渲染进程 (web 页面) 发送同步或异步的消息到主进程。 也可以接收主进程回复的消息。

  • 场景 1:渲染进程给主进程发送异步消息:
// 渲染进程 
//(新建 ipcRenderer.js 在 index.html 中引入)
const { ipcRenderer } = require('electron') 
ipcRenderer.send('msg',{name:'张三'}); //异步
// ipcRenderer.send() 参数1:要触发的方法的名字,参数2:要传输的数据


// 主进程 
//(新建ipcMain.js 在 Main.js 或者 index.js 中 require("路径/ipcMain.js");)
const { ipcMain } = require('electron'); 
ipcMain.on('msg',(event,data) => { 
    console.log(data);
})
// ipcMain.on() 参数1:要触发的方法的名字,参数2:回调函数,回调函数的参数1:事件对象,参数2:接收的传输过来的数据

  • 场景 2:渲染进程给主进程发送异步消息,主进程接收到异步消息以后通知渲染进程
// 渲染进程 
const { ipcRenderer } = require('electron') 
ipcRenderer.send('fnName',{name:'张三'}); //异步 
// 渲染进程监听主进程广播
ipcRenderer.on("reply",(event,data)=>{
    console.log(data);
})


// 主进程 
const { ipcMain } = require('electron'); 
ipcMain.on('fnName',(event,data) => { 
    console.log(data);
    event.sender.send('reply', '我收到了消息'); 
    // event.sender.send() 参数1:回复时触发方法的名称,参数2:要回复的数据
})

  • 场景 3:渲染进程给主进程发送同步消息,主进程接收到同步消息以后通知渲染进程(上面第二种方法的简单版,send后面加上Sync表示同步,sendSync)
//渲染进程 
const { ipcRenderer } = require('electron'); 
const msg = ipcRenderer.sendSync('fnNane',"数据"); // 返回主进程中返回的 value
console.log(msg); // hello


//主进程 
ipcMain.on('msg-a',(event , data)=> { 
    console.log(data);
    event.returnValue = 'hello'; // 给渲染进程回复消息 返回 value
})

  • 场景 4:主进程通知渲染进程执行操作(头部菜单属于主进程,点击之后就通知渲染进程处理某件事情)
//主进程 BrowserWindow.getFocusedWindow().webContents.send('mainToRebderer','news'); 
// 菜单的某一项
// {
//     label: "复制",
//     role: "copy",
//     click: () => {
//         BrowserWindow.getFocusedWindow().webContents.send('mainToRebderer','news'); 
//     }
// },


//渲染进程 
const { ipcRenderer } = require('electron'); 
ipcRenderer.on('mainToRebderer', function(event, arg) { 
    console.log(arg); // news
});