electron-app集成react通信问题
·
electron-app集成react时,大部分操作可以由你的react代码直接完成,而部分操作需要借助electron来跟客户端进行沟通。以下是部分样例。
首先,你需要建立通信渠道。
const { contextBridge,ipcRenderer} = require('electron')
contextBridge.exposeInMainWorld('electronAPI', {
openPublicFolder: () => ipcRenderer.invoke('open-public-folder'),
driverDownload: () => ipcRenderer.invoke('driver-download')
});
以上为部分示例
关键词:
- electronAPI, 这个是electron和react沟通中的通信代名词,你可以自行修改。然后在react项目中使用对应的名词进行调用。
- openPublicFolder, 这个是react 对 electron 发起调用的实际功能代名词。
下面是对这两个代名词操作的部分代码
在React中:
window.electronAPI?.openPublicFolder()
在electron中
openPublicFolder: () => ipcRenderer.invoke('open-public-folder'),
3.open-public-folder 是在electron项目中的代名词。你需要在electron中对这个代名词进行相应的操作,实际代码如下
const { ipcMain,shell} = require('electron')
// 公共文件夹
ipcMain.handle('open-public-folder', async () => {
// 打开公共文件夹
await shell.openPath('/data/html');
});
electron内置了shell, dialog等内容,你可以调用,再比如
const { ipcMain,shell} = require('electron')
const { exec } = require('child_process');
// 驱动软件下载
ipcMain.handle('driver-download', async () => {
// 打开驱动软件下载文件夹
await shell.openPath('/data/html/驱动程序');
});
// 执行服务器命令
ipcMain.handle('cd-burning', async () => {
// 模拟执行命令
// 实际实现可以使用child_process执行系统命令
exec('gtk-launch 你的实际命令');
});
// 处理打开文件夹的请求
ipcMain.handle('open-folder-dialog', async () => {
const result = await dialog.showOpenDialog({
properties: ['openDirectory']
});
if (!result.canceled && result.filePaths.length > 0) {
return result.filePaths[0];
}
return null;
});
所以简要概括步骤
- 在你的electron中 使用contextBridge.exposeInMainWorld 暴露你的对外API,并且在这个方法里写入实际需要的Api调用逻辑
contextBridge.exposeInMainWorld('暴露的electron方法名', {
react中调用的方法名(): () => ipcRenderer.invoke('本地注册的方法名')
});
- 在你的electron中使用ipcMain.handle来进行对应方法的处理
//处理对应调用API
ipcMain.handle('本地注册的方法名', async () => {
// 做你想做的事,利用 electron内置或者插件
});
- 在react中和electron通信,调用需要electron进行操作的客户端操作
window.暴露的electron方法名?.react中调用的方法名()
更多推荐


所有评论(0)