首页 > 系统相关 >electron 和 react 进程通信

electron 和 react 进程通信

时间:2023-07-10 11:24:57浏览次数:51  
标签:文件 调用 ops window 通信 react electron

现在有个需求 ,我想要使用 react 选择上传文件,获取文件路径
在浏览器里面调用 ant design 的 upload 组件是做不到的,只能获取文件名

由于浏览器的安全限制,无法获取文件的完整路径。如果需要获取文件的完整路径,可以考虑使用 Electron 等桌面应用程序开发框架,或者使用 ActiveX 控件等浏览器插件来实现。

这个时候如果使用 electron 的ipcmain , 在react 里面 直接调用 ipcmain 函数的话会报错

报 window.require is not a function

查了文档 发现 electron 有个预加载
文档 https://www.electronjs.org/zh/docs/latest/tutorial/tutorial-preload

就是electron 启动的时候 给全局 window 注册个对象 ,比如注册个 electron 对象 ,这样就可以调用 electron 里面的方法拉, react 在调用的时候判断 window.electron 是否存在 ,存在就调用,不存在就不调用 ,这样就不会报错啦

代码如下
electron.js 这里启用 预加载脚本

然后在electron.js 同级目录下创建 preload.js

const {contextBridge, ipcRenderer} = require('electron')

/**
 * 文件相关
 */
const operateFile = {
    selectFiles: (ops) => ipcRenderer.invoke("dialog:selectFiles", ops),
};

// 将 window.electron 这个对象注入 暴露给浏览器
contextBridge.exposeInMainWorld('electron', {
    node: () => process.versions.node,
    chrome: () => process.versions.chrome,
    electron: () => process.versions.electron,

    // 暴露操作文件
    ...operateFile,
})

在electron.js 里面处理对应的事件

ipcMain.handle("dialog:selectFiles", openDialog);

// 打开文件选择器
async function openDialog(e, ops) {
    const { canceled, filePaths } = await dialog.showOpenDialog(
        new BrowserWindow({
            show: false,
            alwaysOnTop: true,
        }),
        ops
    );
    let result = { code: 199, message: "错误未知", data: {} };
    if (canceled) {
        result = {
            code: 101,
            message: "用户取消选择!",
            data: {},
        };
    } else {
            result = {
            code: 0,
            message: "读取成功!",
            data: {
                fileList: filePaths,
            },
        };
    }

    return result;
}

然后在react 里面调用

最后 点击按钮,就会弹出来 electron 的文件选择框 ,显示出你 现在文件的路径啦

标签:文件,调用,ops,window,通信,react,electron
From: https://www.cnblogs.com/ifnk/p/17540453.html

相关文章

  • labview和西门子plc通信 知识点和领域范围:LabVIEW、西门子PLC、
    labview和西门子plc通信知识点和领域范围:LabVIEW、西门子PLC、通信LabVIEW是一种图形化编程环境,用于控制和测量系统的设计和开发。它提供了一个直观的界面,使工程师能够通过拖放和连接图标来创建程序。西门子PLC(可编程逻辑控制器)是一种常用的工业自动化设备,用于控制和监控生产过程......
  • React18+TS+NestJS+GraphQL 全栈开发在线教育平台
    第1章这里,将带你进行一次全面,高效的进阶试看3节‖36分钟学习本课程你能得到什么?不论是技术提升,职场晋升,面试跳槽,你都会有所收获。第2章了解用户需求,懂得如何做项目试看4节‖54分钟本章让大家了解一个企业级项目的用户需求是什么,有哪几种角色,是如何使用我们的产品的,知道......
  • 通信实务—7.交换与网管
    一、交换技术概述1.交换技术的发展、基本概念和系统架构1.1交换技术的发展电信网络从发展至今,交换技术基本经历了从人工到自动,从机械到电子再到光交换,从早期的电路交换逐渐过渡到分组交换,再随着互联网的发展发展到IP交换。交换技术经过了很大的技术演进。从业务的角度来说,......
  • 话题通信
     /*话题通信:传感器与处理程序之间的通信以发布订阅的方式实现不同节点之间数据交互的通信方式用于不断更新的、少逻辑处理的数据传输场景*//*需求实现发布订阅模型,要求发布方可以周期性的循环发送学生信息,订阅方可以订阅到学生信息,......
  • 服务通信
     /*服务通信:以请求响应的方式实现不同节点之间数据交互的通信模式用于偶然的、对实时性有要求、有一定逻辑处理需求的数据传输场景需求:客户端发送请求提交两个整型数字,服务端处理请求提取两个数字求和,并将结果响应回客户端步骤:......
  • [STM32]STM32双机串口通信
    [STM32]STM32双机串口通信上一篇的通信方案在发送端高强度通信下寄了,发现是函数HAL_UART_Transmit()的锅,一个函数居然能跑0.3s左右。。。于是打算选用DMA收发数据,但是DMA在接收数据时遇到一些玄学问题,于是改用DMA发送数据,串口IDLE中断接收数据的策略。cubeMX配置接收端部分开......
  • 无线通信技术集合
    一、概要介绍随着物联网的广泛应用,无线通信将扮演窄带通信主角,未来将会离不了无线射频技术。二、NB-IOT1、NB-IOT专业名词缩略语:  1)IOT:internetofthing;  2)NB-IOT:narrowbandinternetofthing;  3)IMEI:internationalmobileequipmentidentity国际移动设备识别码;......
  • reactive函数
    作用:定义一个对象类型的响应式数据(基本类型不要用它,要用ref函数)语法:const代理对象=reactive(源对象)接收一个对象(或数组),返回一个代理对象(Proxy的实例对象,简称proxy对象)reactive定义的响应式数据是“深层次的”。内部基于ES6的Proxy实现,通过代理对象操作源对象......
  • 【Reactor模型】事件驱动模型 - Reactor模型简述
    Reactor模式Reactor模式是非阻塞同步网络模式,主要由Reactor和处理资源池这两个核心部分组成,负责:Reactor负责监听和分发事件,事件类型包含连接事件,读写事件;处理资源池负责处理事件,如read->处理逻辑->sendReactor模式是灵活多变的,可以应对不同的业务场景,灵活在于:Reactor的数......
  • [STM32]STM32双机蓝牙串口通信
    [STM32]STM32双机蓝牙串口通信期末考完力,虽然GPA--,但也终于有空搓一搓32了蓝牙模块配置我们先配置蓝牙模块,需要主从兼容,配置过程可以参考这个博客:https://blog.csdn.net/m0_59113542/article/details/122028037?spm=1001.2014.3001.5506cubeMX配置然后就是MX里的配置。PS:两......