学习记录: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))
	},
}
相关推荐
xian_wwq16 小时前
【学习笔记】攻击链贯穿端边云!边缘网络访问三大核心风险预警
笔记·学习·安全·边缘计算
拉不动的猪19 小时前
webpack编译中为什么不建议load替换ast中节点删除consolg.log
前端·javascript·webpack
深蓝海拓19 小时前
PySide6从0开始学习的笔记(一) 学前班
笔记·学习
EveryPossible20 小时前
优先级调整练习1
大数据·学习
逐辰十七20 小时前
FreeRTOS 中断管理 (Chapter 17) 核心学习大纲
学习
智行众维20 小时前
【用户心得】SCANeR™Studio学习笔记(六):人因工程Pack——一站式搞定驾驶模拟的多模态数据同步
笔记·学习·自动驾驶·汽车·仿真·scaner·人因工程
kissgoodbye201220 小时前
cadence学习之基础知识
网络·学习
xian_wwq21 小时前
【学习笔记】基于人工智能的火电机组全局性能一体化优化研究
人工智能·笔记·学习·火电
阿蒙Amon21 小时前
JavaScript学习笔记:6.表达式和运算符
javascript·笔记·学习
小a杰.21 小时前
Flutter 设计系统构建指南
开发语言·javascript·ecmascript