当前位置: 首页 > 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

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

http://www.lryc.cn/news/295509.html

相关文章:

  • thinkphp6入门(19)-- 中间件向控制器传参
  • Flink Format系列(2)-CSV
  • Spring Data Envers 数据审计实战2 - 自定义监听程序扩展审计字段及字段值
  • 一个 SpringBoot 项目能同时处理多少请求?
  • 计算机网络——网络
  • C语言探索:选择排序的实现与解读
  • Golang 学习(二)进阶使用
  • ubuntu22.04@laptop OpenCV定制化安装
  • linux系统非关系型数据库redis
  • 【LeetCode: 292. Nim 游戏+ 博弈问题】
  • Android 9.0 禁用adb reboot recovery命令实现正常重启功能
  • 分析网站架构:浏览器插件
  • CentOS7搭建Hadoop集群
  • 10.0 Zookeeper 权限控制 ACL
  • 容器化技术基础概念:雪花服务器与凤凰服务器
  • 解决maven 在IDEA 下载依赖包速度慢的问题
  • 用python编写爬虫,爬取二手车信息+实验报告
  • 代码随想录算法训练营第二十九天|491.非递减子序列、46.全排列、47.全排列II
  • (2)(2.14) SPL Satellite Telemetry
  • OTG -- STM32 OTG驱动代码下载及简述(三)
  • STM32F407 CAN参数配置 500Kbps
  • python常用的深度学习框架
  • 将xyz格式的GRACE数据转成geotiff格式
  • 【机器学习】机器学习流程之收集数据
  • IP风险画像在企业网络统计与安全防范中应用
  • Unity类银河恶魔城学习记录3-6 Finalize BattleState源代码 P52
  • 【语音合成】中文-多情感领域-16k-多发音人
  • 07-使用Package、Crates、Modules管理项目
  • spring.jpa.hibernate 配置和源码解析
  • 2019年江苏省职教高考计算机技能考试——一道程序改错题的分析