学习记录:electron主进程与渲染进程直接的通信示例【开箱即用】

electron主进程与渲染进程直接的通信示例

1. 背景:

electron+vue实现桌面应用开发

2.异步模式

2.1使用.send.on的方式

preload.js中代码示例:

javascript 复制代码
const { contextBridge, ipcRenderer} = require('electron');


// 暴露通信接口
contextBridge.exposeInMainWorld('electron', {
	// 渲染进程向主进程通信
	sendAppDataPath: function(){
		ipcRenderer.send('sendappdatapath')
	},
	// 主进程向渲染进程通信
	onAppDataPath: (callback) => ipcRenderer.on('appdatapath', (event, variable) => callback(variable)),
	// 使用请求、响应模式【也是异步模式】,上面的on,send同为异步模式
	gainAppDataPath: async () => {
		return await ipcRenderer.invoke('gainappdatapath');
	},
	// 同步模式
	syncAppDataPath: () => ipcRenderer.sendSync('syncappdatapath'),

});

main.js【主进程】:

javascript 复制代码
// 获取appdata路径,并返回给vue
ipcMain.on('sendappdatapath', function(event){
	// 方法1:返回变量给vue
	event.reply('appdatapath', appDataPath); // 可发送成功,接收需在vue mounted中接收
	// 方法2:使用.send 发送
	// event.sender.send('appdatapath', appDataPath); // 可发送成功,接收也需要再 vue mounted中接收
})

vue.js【渲染进程】:

javascript 复制代码
// 发送部分代码
methods: {
	demo: function(){
		window.electron.sendAppDataPath(); // 调用发送接口
	},
}
// 需要在vue中的mounted中监听
mounted() {
  	// 监听主进程的变量
	// 接收send、on的appdata变量
	window.electron.onAppDataPath((variable) => {
		console.log('接受到变量:' + variable)
	})
  },

2.2 使用.invoke的方式

preload.js中代码示例:

javascript 复制代码
const { contextBridge, ipcRenderer} = require('electron');


// 暴露通信接口
contextBridge.exposeInMainWorld('electron', {
	// 使用请求、响应模式【异步】
	gainAppDataPath: async () => {
		return await ipcRenderer.invoke('gainappdatapath');
	},
	// 同步模式
	syncAppDataPath: () => ipcRenderer.sendSync('syncappdatapath'),

});

main.js【主进程】:

javascript 复制代码
// 响应模式返回给vue
ipcMain.handle('gainappdatapath', () => {
	console.log('invoke back varable');
	return appDataPath;
})

vue.js【渲染进程】:

javascript 复制代码
// 在vue中的methods中
methods: {
	// 获取电脑apdata目录
		async gainAppDataPath() {
			// invoke响应模式 【异步】
			let appdatapath = await window.electron.gainAppDataPath();
			console.log('目录为:' + appdatapath)
		},
}

3. 同步模式

3.1 使用.sendSync

preload.js中代码示例:

javascript 复制代码
const { contextBridge, ipcRenderer} = require('electron');


// 暴露通信接口
contextBridge.exposeInMainWorld('electron', {
	// 同步模式
	syncAppDataPath: () => ipcRenderer.sendSync('syncappdatapath'),
});

main.js【主进程】:

javascript 复制代码
// 同步模式
ipcMain.on('syncappdatapath', (event) => {
	event.returnValue = xxx; 
})

vue.js【渲染进程】:

javascript 复制代码
// 发送部分代码
methods: {
	demo: function(){
		let syncappdatapath = window.electron.syncAppDataPath();
		console.log('同步模式目录为:' + JSON.stringify(syncappdatapath))
	},
}
相关推荐
codingandsleeping29 分钟前
一个简易版无缝轮播图的实现思路
前端·javascript·css
小斌的Debug日记1 小时前
SpringBoot和微服务学习记录Day3
spring boot·学习·微服务
路有瑶台1 小时前
EXCEL学习
学习·excel
计算机视觉与OpenCV1 小时前
自动驾驶与机器人算法学习
学习·机器人·自动驾驶
筱小虾米1 小时前
Dify忘记管理员密码,重置的问题
人工智能·学习·dify
FAREWELL000751 小时前
C#进阶学习(九)委托的介绍
开发语言·学习·c#·委托
拉不动的猪2 小时前
简单回顾下插槽透传
前端·javascript·面试
爱吃鱼的锅包肉2 小时前
Flutter路由模块化管理方案
前端·javascript·flutter
我的代码永没有bug2 小时前
day1-小白学习JAVA---JDK安装和环境变量配置(mac版)
java·学习·macos
风清扬雨2 小时前
Vue3具名插槽用法全解——从零到一的详细指南
前端·javascript·vue.js