当前位置: 首页 > news >正文

7.electron之渲染线程发送事件,主进程监听事件

如果可以实现记得点赞分享,谢谢老铁~

Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 将 Chromium 和
Node.js 嵌入到了一个二进制文件中,因此它允许你仅需一个代码仓库,就可以撰写支持 Windows、macOS 和 Linux
的跨平台应用。

1.项目效果, 我的目的是打开一个弹窗,点击按钮打开文件管理器,且只能选中文件夹而不是文件的路径
在这里插入图片描述
2.这里要分两个进程说,先说渲染进程,也就是我们的业务逻辑层
index.tsx

import { Button } from 'antd';
import { useState } from 'react';
import { EllipsisOutlined } from '@ant-design/icons';export default () => {const [inputPath, setInputPath] = useState('')const openFileDialog = () => {// 发送事件到主进程try {window.ipcRenderer.send('buttonClicked');// 监听主进程回复的选择的文件路径window.ipcRenderer.on('selected-file', (event, filePaths) => {if (filePaths) {setInputPath(filePaths)}});} catch (error) {console.log('web网页版不支持获取目录,请在桌面端操作')}};return (<div><Input value={inputPath} style={{ width: '92%' }} readOnly /><Button icon={<EllipsisOutlined onClick={openFileDialog} />} /><div/>);
};

上述代码块中,通过

window.ipcRenderer.send('buttonClicked'); // 自定义事件名发送事件

PS:你肯定有个大大的疑问 window.ipcRenderer 这个哪里来的?这个是
主进程里面的预加载js模块,作用在window全局里了,不懂得请点击 上一篇文章
《6.electron之上下文隔离,预加载JS脚本》

3.现在来说一下 主进程是如何监听事件的
electron.js

const {dialog,ipcMain,
} = require("electron");// 监听来自渲染进程的事件,这里的 'buttonClicked' 就是渲染进程中的自定义名字。ipcMain.on('buttonClicked', (event, arg) => {// 在这里处理事件的逻辑dialog.showOpenDialog(mainWindow, {properties: ['openDirectory'], // openDirectory 代表文件夹title: '选择文件夹',buttonLabel: '选择',}).then(result => {if (!result.canceled && result.filePaths.length > 0) {const selectedFolder = result.filePaths[0];// PS: 发送选择的文件路径给渲染进程event.reply('selected-file', selectedFolder);}}).catch(err => {console.error(err);});});

4.运行以下命令来构建React项目:

npm run build

PS:打开build目录下的index.html文件,发现是一片空白😱,F12一下,发现是资源路径不对。解决方案是在package.json中添加"homepage": “./”。添加之后再进行build,打开index.html,就能看到正常页面了。

5.运行以下命令来启动Electron应用程序:

npm run electron:dev

这将启动Electron应用程序,并加载React应用程序的构建文件。

6.运行以下命令来打包Electron应用程序:

npm run electron:build

收工!谢谢老铁们的点赞收藏~

相关文章:

  • 如何利用chatgpt提升工作效率?
  • Redis篇之持久化
  • 云计算、Docker、K8S问题
  • 2024PMP考试新考纲-近年PMP真题练一练和很详细解析(3)
  • netty-websocket扩展协议及token鉴权补充
  • 多线程(一)
  • 【力扣】查找总价格为目标值的两个商品,双指针法
  • Mac 下JDK环境变量配置 及 JDK多版本切换
  • 吉他学习:识谱,认识节奏,视唱节奏,节拍器的使用
  • 2402d,d的静态构造器
  • 多线程基础详解(看到就是赚到)
  • 预测模型:MATLAB线性回归
  • 在 VMware 虚拟机上安装 CentOS系统 完整(全图文)教程
  • K8S之Pod常见的状态和重启策略
  • 人工智能之无约束最优化与有约束最优化
  • #Java异常处理
  • 【RocksDB】TransactionDB源码分析
  • Angular 2 DI - IoC DI - 1
  • classpath对获取配置文件的影响
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • HTML-表单
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • in typeof instanceof ===这些运算符有什么作用
  • jquery cookie
  • js学习笔记
  • Less 日常用法
  • orm2 中文文档 3.1 模型属性
  • php ci框架整合银盛支付
  • php面试题 汇集2
  • V4L2视频输入框架概述
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 工作手记之html2canvas使用概述
  • 机器学习 vs. 深度学习
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 三栏布局总结
  • 思否第一天
  • 鱼骨图 - 如何绘制?
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # Panda3d 碰撞检测系统介绍
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • # 数据结构
  • (3)nginx 配置(nginx.conf)
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (二)学习JVM —— 垃圾回收机制
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (译) 函数式 JS #1:简介
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • **python多态
  • .NET 命令行参数包含应用程序路径吗?
  • .net6 webapi log4net完整配置使用流程
  • .NetCore 如何动态路由
  • .NET基础篇——反射的奥妙