学习记录: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))
	},
}
相关推荐
eastyuxiao10 小时前
数字孪生教程(软件篇)官方学习路径
大数据·人工智能·学习·数字孪生
小徐学编程-zZ10 小时前
拆解业务逻辑分析
数据库·学习
scan72410 小时前
pydantic格式输出
服务器·前端·javascript
知识分享小能手10 小时前
R语言入门学习教程,从入门到精通,R语言获取数据 (7)
开发语言·学习·r语言
ZC跨境爬虫10 小时前
跟着MDN学HTML_day44:(ProcessingInstruction接口)
前端·javascript·ui·html·媒体
木木_王11 小时前
嵌入式学习 | STM32裸板驱动开发(Day01)入门学习笔记(超详细完整版|点灯实验 + 库函数代码 + 原理全解)
linux·驱动开发·笔记·stm32·学习
JAVA面经实录91711 小时前
Java架构师最终完整版学习路线图
java·开发语言·学习
叶子野格11 小时前
数据集网站kaggle注册无验证码选项?
学习
for_ever_love__11 小时前
UI学习:数据驱动ce l l
学习·ui·ios·objective-c
ZC跨境爬虫11 小时前
跟着MDN学HTML_day_45:(EventTarget接口)
前端·javascript·ui·html·媒体