Electron 中渲染进程与渲染进程之间的通信详解
2021/4/19 7:25:55
本文主要是介绍Electron 中渲染进程与渲染进程之间的通信详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Electron中渲染进程与渲染进程之间的通信主要有两种方式,一种是通过本地存储来实现,另外一种就是借助主进程进行传递消息。
1. 渲染进程之间通过本地存储进行通信
渲染进程index传递消息。
// index.js window.onload = () => { var button = document.getElementById("button"); button.onclick=()=>{ // 渲染进程index与渲染进程news之间直接进行通信 localStorage.setItem("msg","世界那么大,我想去看看"); }; };
渲染进程news获取消息。
// news.js window.onload=()=>{ // 渲染进程index与渲染进程news之间直接进行通信 var msg = localStorage.getItem("msg"); alert(msg); // 世界那么大,我想去看看 }
2. 当前渲染进程向新打开的渲染进程传递消息
渲染进程index发送消息。
// index.js const {ipcRenderer} =require("electron"); window.onload = () => { var button = document.getElementById("button"); button.onclick=()=>{ // 发送消息 ipcRenderer.send( "openNews", "钱包那么少,哪儿也去不了" ); }; };
主进程ipcMain接受渲染进程index的消息,并传递给新创建的渲染进程news。
// ipcMain.js const {BrowserWindow,ipcMain} = require("electron"); const path = require("path"); // 监听渲染进程index传递的消息并创建新的渲染进程news ipcMain.on("openNews",(e,data)=>{ const newsWindow = new BrowserWindow({ width:400, height:300, webPreferences:{ // 集成node nodeIntegration:true, // 取消上下文隔离 contextIsolation:false, // 启用remote模块 enableRemoteModule:true } }); newsWindow.loadFile(path.join(__dirname,"../news.html")); // 监听渲染进程news加载完成 newsWindow.webContents.on('did-finish-load',(event)=>{ // 发送消息给渲染进程news newsWindow.webContents.send("toNews",data) }); });
渲染进程news接受渲染进程index通过主进程ipcMian传递过来的消息。
// new.js const {ipcRenderer} = require("electron"); // 监听渲染进程index通过主进程ipcMain发送的消息 ipcRenderer.on("toNews",(e,data)=>{ alert(data); // 钱包那么少,哪儿也去不了 });
3. 新打开的渲染进程向之前已经打开的渲染进程传递消息
渲染进程news发送消息。
// news.js window.onload = ()=>{ var button = document.getElementById("button"); button.onclick = ()=>{ // 渲染进程news向渲染进程index传递消息 ipcRenderer.send("sendToIndex","工作没做完,还得继续干") }; }
主进程ipcMain接受渲染进程news的消息,并传递给之前已经打开的渲染进程index。
// ipcMain.js const {BrowserWindow,ipcMain} = require("electron"); const path = require("path"); // 保存已经打开的渲染进程index var indexId; // 监听渲染进程index传递的消息并创建新的渲染进程news ipcMain.on("openNews",(e,data)=>{ // 创建渲染进程news之前获取当前渲染进程index的id并保存; indexId = BrowserWindow.getFocusedWindow().id; // 创建渲染进程news ...... }); // 监听渲染进程news中传递过来的消息 ipcMain.on("sendToIndex",(e,data)=>{ // console.log(data); // 工作没做完,还得继续干 // 获取之前保存的渲染进程index var mainWindow = BrowserWindow.fromId(indexId); // 发送消息给渲染进程index mainWindow.webContents.send("toIndex",data); })
渲染进程index监听渲染进程news通过主进程ipcMian传递过来的消息。
// index.js const {ipcRenderer} =require("electron"); // 监听渲染进程news通过主进程ipcMain传过来的消息 ipcRenderer.on("toIndex",(e,data)=>{ console.log(data); });
4. 代码实例
主进程main.js文件代码:
// main.js const { app, BrowserWindow } = require("electron"); const path = require("path"); const createWindow = () => { // 创建窗口 const mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { // 开启node nodeIntegration: true, // 取消上下文隔离 contextIsolation: false, // 开启remote enableRemoteModule:true, } }); // 加载本地文件 mainWindow.loadFile(path.join(__dirname, "index.html")); // 加载远程地址 // mainWindow.loadURL('https://github.com'); // 开启调试模式 mainWindow.webContents.openDevTools(); // 引入主进程的通信 require('./ipcMain/ipcMain.js'); } // 监听应用的启动事件 app.on("ready", createWindow); // 兼容MacOS系统的窗口关闭功能 app.on("window-all-closed", () => { // 非MacOS直接退出 if (process.platform != "darwin") { app.quit(); } }); // 点击MacOS底部菜单时重新启动窗口 app.on("activate", () => { if (BrowserWindow.getAllWindows.length == 0) { createWindow(); } })
主进程main.js中引入的ipcMain.js文件代码:
// ipcMain.js const {BrowserWindow,ipcMain} = require("electron"); const path = require("path"); // 保存已经打开的渲染进程index var indexId; // 监听渲染进程index传递的消息并创建新的渲染进程news ipcMain.on("openNews",(e,data)=>{ // 创建渲染进程news之前获取当前渲染进程index的id并保存; indexId = BrowserWindow.getFocusedWindow().id; const newsWindow = new BrowserWindow({ width:400, height:300, webPreferences:{ // 集成node nodeIntegration:true, // 取消上下文隔离 contextIsolation:false, // 启用remote模块 enableRemoteModule:true } }); newsWindow.loadFile(path.join(__dirname,"../news.html")); // 监听渲染进程news加载完成 newsWindow.webContents.on('did-finish-load',(event)=>{ // 发送消息给渲染进程news newsWindow.webContents.send("toNews",data) }); }); // 监听渲染进程news中传递过来的消息 ipcMain.on("sendToIndex",(e,data)=>{ // console.log(data); // 工作没做完,还得继续干 // 获取之前保存的渲染进程index var mainWindow = BrowserWindow.fromId(indexId); // 发送消息给渲染进程index mainWindow.webContents.send("toIndex",data); })
渲染进程index.html文件代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Electron开发</title> </head> <body> <p>Electron中渲染进程与渲染进程之间的通信</p> <br><br> <button id="button">打开新窗口</button> <script src="./ipcRenderer/index.js"></script> </body> </html>
渲染进程index.html中引入的index.js文件代码:
// index.js const {ipcRenderer} =require("electron"); window.onload = () => { var button = document.getElementById("button"); button.onclick=()=>{ // 渲染进程index与渲染进程news之间直接进行通信 // localStorage.setItem("msg","世界那么大,我想去看看"); // 发送消息 ipcRenderer.send( "openNews", "钱包那么少,哪儿也去不了" ); }; }; // 监听渲染进程news通过主进程ipcMain传过来的消息 ipcRenderer.on("toIndex",(e,data)=>{ console.log(data); });
渲染进程news.html文件代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Electron开发</title> </head> <body> <p>这是打开的新页面</p> <button id="button">执行index里面的方法并传值</button> <script src="./ipcRenderer/news.js"></script> </body> </html>
渲染进程news.html中引入的news.js文件代码:
const {ipcRenderer} = require("electron"); // window.onload=()=>{ // 渲染进程index与渲染进程news之间直接进行通信 // var msg = localStorage.getItem("msg"); // alert(msg); // 世界那么大,我想去看看 // } // 监听渲染进程index通过主进程ipcMain发送的消息 ipcRenderer.on("toNews",(e,data)=>{ alert(data); // 钱包那么少,哪儿也去不了 }); window.onload = ()=>{ var button = document.getElementById("button"); button.onclick = ()=>{ // 渲染进程news向渲染进程index传递消息 ipcRenderer.send("sendToIndex","工作没做完,还得继续干") }; }
这篇关于Electron 中渲染进程与渲染进程之间的通信详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享