超详细!!!electron-vite-vue开发桌面应用之创建新窗口以及主进程和子进程的通信监听(十二)

news2024/11/15 18:51:14

云风网
云风笔记
云风知识库

一、新建打开窗口

1、在electron/main.ts中加入主进程打开窗口逻辑代码
import { ipcMain } from "electron";
ipcMain.handle("open-win", (_, arg) => {
  const childWindow = new BrowserWindow({
    webPreferences: {
      preload:path.join(__dirname, 'preload.mjs'),
      nodeIntegration: true,
      contextIsolation: false,
    },
  });
  childWindow.loadFile(path.join(RENDERER_DIST, 'index.html'),{
    hash: arg
  });
});
2、在electron/preload.ts中定义ipcRenderer全局方法
import { ipcRenderer } from 'electron'
window.ipcRenderer = ipcRenderer
3、在src/utils下新建electron.ts封装打开窗口的公共方法
/**
 * 新建窗口
 * @param path 路由地址
 */
export function openWindow(path: string) {
  window.ipcRenderer.invoke("open-win", path);
}
export default {
  openWindow
};
4、在前端文件中应用打开新的窗口
<script setup lang="ts">
const router = useRouter()
import electronUtils from "@/utils/electron";
const toUser = () => {
  router.push('/userManage')
}
const toNote = () => {
  router.push('/func/noteManage')
}
const toLogin = () => {
  router.push('/login')
}
const toOpenLogin = () => {
  electronUtils.openWindow('/login');
}
</script>

<template>
  <div class="container">
    <a @click="toUser()">用户管理</a>
    <a @click="toNote()">语录管理</a>
    <a @click="toLogin()">去登录</a>
    <a @click="toOpenLogin()">创建新窗口</a>
  </div>
</template>

在这里插入图片描述
在这里插入图片描述

二、主进程和子进程的通信

electron项目常常由一个主进程和多个渲染进程构成,渲染进程之间是隔离的,而所有渲染进程都和主进程共享资源。

  1. 所有的渲染进程都是由主进程创建的
  2. 每个窗口都对应着一个渲染进程
  3. 所有的渲染进程共享一个主进程
  4. 渲染进程与渲染进程交互【多窗口交互】,都需要借助ipc通信来实现

2.1、子进程向主进程单向通信

1、在electron目录下创建ipc.ts
import { ipcMain } from "electron";

export const initIpc = () => {
  // 同步通信监听
  ipcMain.on("eventSync", (e, data: string) => {
    setTimeout(() => {
      e.returnValue = "主进程同步响应:" + data;
    }, 1000);
  });

  // 异步通信监听
  ipcMain.handle("eventAsync", (e, data: string) => {
      return "主进程异步响应:" + data;
  });

  // 异步通信一次
  ipcMain.handleOnce("eventAsyncOnce", (e) => {
    console.log("异步通信一次!",e);
  });
};
2、在main.ts引入初始化
import {initIpc} from './ipc'
//初始化initIpc
initIpc()
3、在用户管理新增用户详情编辑子路由
{
    path: '/',
    component: Layout,
    hidden: false,
    redirect: 'noredirect',
    children: [
      ...
      {
        path: 'userManage/detail',
        component: () => import('@/views/userManage/detail.vue'),
        name: 'detail',
        meta: { title: '用户详情', icon: 'user' },
        hidden: true
      }
    ]
  }
4、在src/views/userManage下新建detail.vue
<script setup lang="ts">
import { ipcRenderer } from "electron";

function toSyncSaveUserInfo() {
  const result = ipcRenderer.sendSync("eventSync", "同步保存");// 同步通信测试
  console.log(result);
}
function toAsyncSaveUserInfo() {
  const result = ipcRenderer.invoke("eventAsync", "异步保存");// 异步通信测试
  console.log(result);
}
function toAsyncOnceSaveUserInfo() {
  const result = ipcRenderer.invoke("eventAsyncOnce", "异步保存一次");// 异步通信测试一次
  console.log(result);
}
</script>

<template>
  <a @click="toSyncSaveUserInfo()">同步保存</a>
  <a @click="toAsyncSaveUserInfo()">异步保存</a>
  <a @click="toAsyncOnceSaveUserInfo()">异步保存一次</a>
</template>

<style scoped>

</style>
4、在src/views/userManage/index.vue添加打开编辑用户信息窗口的代码
<script setup lang="ts">
import electronUtils from "@/utils/electron";
const router = useRouter()
const toIndex = () => {
  router.push('/')
}
const toNote = () => {
  router.push('/func/noteManage')
}
const toEditUserInfo = () => {
  electronUtils.openWindow('/userManage/detail');
}
</script>

<template>
  <a @click="toIndex()">首页</a>
  <a @click="toNote()">语录管理</a>
  <a @click="toEditUserInfo()">编辑用户详情</a>
</template>

<style scoped>

</style>

在这里插入图片描述

5、点击打开用户详情子窗口进程

在这里插入图片描述

点击保存用户信息,子进程向主进程通信

同步保存、异步保存、异步保存一次,其中异步保存一次后主进程移除监听,再次点击保存报错

2.2、主进程向子进程单向通信

1、main.ts定义定时器通信数据给子进程
ipcMain.handle("open-win", (_, arg) => {
  const childWindow = new BrowserWindow({
    webPreferences: {
      preload:path.join(__dirname, 'preload.mjs'),
      nodeIntegration: true,
      contextIsolation: false,
    },
  });
  let count = 100
  setInterval(() => {
    if (childWindow&&childWindow.webContents) {
      childWindow?.webContents.send("to-child-count", '金额:'+count++);
    }
  }, 1000);
  childWindow.webContents.openDevTools();
  childWindow.loadFile(path.join(RENDERER_DIST, 'index.html'),{
    hash: arg
  });
  
});
2、detail.vue监听主进程通信数据
// 监听主进程信息
function toChildCount(e:any,data:string){
    console.log(data)
}
onMounted(()=>{
    ipcRenderer.on("to-child-count",toChildCount);
    console.log("监听主进程信息")
});
onUnmounted(()=>{
    console.log('移除监听主进程信息')
    ipcRenderer.removeListener("to-child-count",toChildCount);
});

在这里插入图片描述

2.3、主进程和子进程双向通信

1、electron/ipc.ts添加双向通信逻辑
//双向通信
ipcMain.handle("eventBothWay", (e, data: string) => {
  e.sender.send("eventBothWay", "主进程发送" + data);
});
2、detail.vue子进程添加监听逻辑
function eventBothWay(e:any,data:string){
    console.log("子进程监听的信息:",data);
}
function toBothWay(){
  ipcRenderer.invoke("eventBothWay","异步发给主进程的消息");
}
onMounted(()=>{
    ipcRenderer.on("eventBothWay",eventBothWay);
    
    // ipcRenderer.on("to-child-count",toChildCount);
    // console.log("监听主进程信息")
});
onUnmounted(()=>{
    ipcRenderer.removeListener("eventBothWay",eventBothWay);

    // console.log('移除监听主进程信息')
    // ipcRenderer.removeListener("to-child-count",toChildCount);
});
<a @click="toBothWay()">双向通信</a>

点击双向通信,可以控制台获取双向信息打印

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2110595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码执行漏洞-Log4j2漏洞

1.执行以下命令启动靶场环境并在浏览器访问 cd log4j/CVE-2021-44228docker-compose up -ddocker ps 2.先在自己搭建的DNSLOG平台上获取⼀个域名来监控我们注⼊的效果 3.可以发现 /solr/admin/cores?action 这⾥有个参数可以传&#xff0c;可以按照上⾯的原理 先构造⼀个请求…

TomCat环境配置(实验报告)

实验 Tomcat 实验环境配置 一、实验目的 1、掌握Tomcat的安装和启动 2、掌握在IntelliJ IDEA中配置Tomcat的方法 二、实验环境 1、硬件&#xff1a;PC电脑一台&#xff0c;网络正常&#xff1b; 2、配置&#xff1a;Windows10系统&#xff0c;内存8G及以上&#xff0c;硬盘…

LAN变压器的DCR

在变压器技术中&#xff0c;DCR代表直流电阻&#xff08;DC Resistance&#xff09;。它是变压器线圈在直流条件下测得的电阻值&#xff0c;通常用来评估变压器的质量和效率。直流电阻是线圈材料和尺寸的一个函数&#xff0c;它与变压器线圈的发热量和功率损耗直接相关。在变压…

在平板电脑上使用Chrome观看视频的最佳技巧

随着移动设备的普及&#xff0c;越来越多的人选择在平板电脑上观看视频。谷歌浏览器&#xff08;Chrome&#xff09;作为一款功能强大的网页浏览器&#xff0c;提供了许多方便的功能来优化你的视频观看体验。以下是一些在平板电脑上使用Chrome观看视频时的最佳技巧。 &#xf…

个人旅游网(2)——功能详解——用户登录注册功能

文章目录 一、用户登录1.1、接口详解1.1.1、isLogged (判断用户是否登录)1.1.2、find-by-telephone&#xff08;输入手机号时校验手机号是否注册&#xff09;1.1.3、send-message&#xff08;发送验证码&#xff09;1.1.4、login-by-telephone&#xff08;登录按钮&#xff09;…

给力!Python配置文件,这一篇就够了!

在开发过程中&#xff0c;我们常常会用到一些固定参数或者是常量。对于这些较为固定且常用到的部分&#xff0c;往往会将其写到一个固定文件中&#xff0c;避免在不同的模块代码中重复出现从而保持核心代码整洁。 这里插播一条粉丝福利&#xff0c;如果你在学习Python或者有计划…

修改设置内以及手机桌面的软件icon和名称

// 设置 - 应用和元服务内修改软件icon和名称等相关信息 // 位置&#xff1a; 设置 - 应用和元服务 // AppScore/app.json5// 这里不是在桌面看, 是在设置 - 应用和元服务内看的 // 模拟器内: 版本号改了之后要卸载后重新安装才能看 {"app": {"bundleName"…

【GC】垃圾回收原理分析

本文基于小许先生的编程世界学习了gc机制。 面试官&#xff1a;了解gc机制吗&#xff1f;简述一下。 我&#xff1a;golang为清除不再被使用的对象&#xff0c;回收内存的机制。采用了三色标记法混合写屏障。首先开启屏障&#xff0c;一旦在gc期间发生指针引用变化&#xff0c;…

解决启动Nginx时80端口被占用的问题

文章目录 前言 解决方法1. 搜索服务打开![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c7600d266d194bdb864f7660a5bc5890.png)2. 找到World Wide Web 发布服务这个服务&#xff0c;右键属性&#xff0c;将它的启动类型改为手动&#xff0c;然后停止掉该服务。3. 此…

虚拟化技术:新能源汽车空调控制系统的智能新突破

汽车生产中&#xff0c;空调系统已经成为标配&#xff0c;空调系统的性能是衡量一辆汽车是否舒适的重要指标之一。 01.汽车空调系统组成 (1) 制冷系统&#xff1a;制冷系统的功能是给汽车内部提供冷空气&#xff0c;主要由压缩机、冷凝器、膨胀阀以及蒸发器组成。首先由压缩机…

释放国产光耦合器的潜力

光耦合器&#xff0c;也称为光隔离器&#xff0c;已成为现代电子产品中不可或缺的组件。它们的主要功能是在电路的不同部分之间提供电气隔离&#xff0c;确保安全并防止干扰。随着技术的发展&#xff0c;光耦合器也在不断发展&#xff0c;国产光耦合器现在在性能和成本方面都具…

回归预测|基于粒子群优化核极限学习机PSO-KELM结合Adaboost集成的数据预测Matlab程序 多特征输入单输出

回归预测|基于粒子群优化核极限学习机PSO-KELM结合Adaboost集成的数据预测Matlab程序 多特征输入单输出 文章目录 一、基本原理1. 数据预处理2. PSO优化&#xff08;粒子群优化&#xff09;3. KELM训练&#xff08;核极限学习机&#xff09;4. AdaBoost集成5. 模型评估和优化6.…

004: VTK读入数据---vtkImageData详细说明

VTK医学图像处理---vtkImageData类 目录 VTK医学图像处理---vtkImageData类 简介&#xff1a; 1 Mricro软件的安装和使用 (1) Mricro安装 (2) Mricro转换DICOM为裸数据 2 从硬盘读取数据到vtkImageData 3 vtkImageData转RGB或RGBA格式 4 练习 总结 简介&#xff1a;…

Minikube Install Kubernetes v1.18.1

文章目录 简介安装工具配置代理运行集群检查集群加入rancher 简介 模拟客户环境&#xff0c;测试 kubernetes v1.18.x 是否可以被 rancher v2.9.1 纳管。 安装工具 docker 安装Install and Set Up kubectl on Linux 安装 minikube 配置代理 docker proxylinux proxy 运行…

python进阶篇-day07-进程与线程

day06进程与线程 一. 进程 每个软件都可以看作是一个进程(数据隔离) 软件内的多个任务可以看作是多个线程(数据共享) 单核CPU: 宏观并行, 微观并发 真正的并行必须有多核CPU 多任务介绍 概述 多任务指的是, 多个任务"同时"执行 目的 节约资源, 充分利用CPU资源, …

万龙觉醒辅助:VMOS云手机辅助前期宝物选择!万龙觉醒怎么挂机?

《万龙觉醒》作为一款策略战争类游戏&#xff0c;玩家们在日常进行游戏时&#xff0c;可能会遇到游戏时间不足或无法长时间在线的问题。而通过使用VMOS云手机&#xff0c;可以实现24小时游戏云端在线托管&#xff0c;无需手动操作&#xff0c;彻底解放双手&#xff0c;随时随地…

【人工智能学习笔记】1_人工智能基础

本系列是个人学习《阿里云人工智能工程师ACA认证免费课程&#xff08;2023版&#xff09;》的笔记&#xff0c;仅为个人学习记录&#xff0c;欢迎交流&#xff0c;感谢批评指正 人工智能概述 智能的三大能力&#xff1a;感知、记忆与思维、学习与适应能力人工智能的定义 明斯基…

4 个最佳 3D 数据可视化工具(免费和付费)

摘要: 在当今的技术时代,数据可视化在软件测试领域发挥着相当重要的作用。简而言之,数据可视化是设计并分析数据视觉表示的过程。其中有一些顶级的数据可视化工具超出了工作范围。在数据可视化工具的帮助下,变得相当简单、更加准确。这是因为这些工具进一步消除了对手工劳动…

经济不景气?相反,这才是普通人赚钱的绝佳机会!

“日子越来越难了!”身边类似的抱怨越来越多。 想想也是&#xff0c;这两年市场低迷、房地产暴雷、各行业内卷.....即便兜里有钱的&#xff0c;也面临资产缩水的风险。 但好在从去年开始&#xff0c;国内外AI企业黑马连出&#xff0c;AI文本、图片、视频生产模型直接颠覆了传…

1990-2022年各地级市gdp、一二三产业gdp及人均gdp数据

1990-2022年各地级市gdp、一二三产业gdp及人均gdp数据 1、时间&#xff1a;1990-2022年 2、来源&#xff1a;城市统计年鉴 3、指标&#xff1a;年度、城市名称、城市代码、城市类别、省份标识、省份名称、国内生产总值/亿元、第一产业占GDP比重(%)、第二产业占GDP比重(%)、第…