electron+vue3全家桶+vite项目搭建【28】封装窗口工具类【2】窗口组,维护窗口关系
文章目录
- 引入
- 实现效果
- 思路
- 主进程模块
- 渲染进程模块
- 测试效果
引入
demo项目地址
窗口工具类系列文章:
封装窗口工具类【1】雏形
封装窗口工具类【2】窗口组,维护窗口关系
封装窗口工具类【3】控制窗口定向移动
我们思考一下窗口间的关系,窗口创建和销毁的一些动作,例如父子窗口,窗口组合等等,还有一些窗口只能有一个,而某些窗口可以有很多个,按我们当前的窗口创建逻辑,是无法维护一个很复杂的窗口系统的,这就需要我们引入一个窗口组,里面维护各个窗口之间的关系和状态。
实现效果
- 没有传入key时,默认用窗口id作为窗口组中元素的key
- 窗口销毁时,元素正常从窗口组中移除
- 传入相同的key时,旧窗口被聚焦

思路
从如下场景出发:
- 我们希望一个唯一窗口被创建后,当再次执行窗口创建时,只是聚焦旧窗口,而不是重新创建窗口。
- 如何快速的获取某个已建窗口的 windowId或webContentsId,直接用于窗口间的通信
解决方案:
- 维护一个窗口组,即一个map集合,key作为窗口的唯一标识,每次创建时必须传入key,新建窗口通过判断key是否已存在来聚焦旧窗口
- map集合的值存储一个对象,对象内存储窗口的windowId和webContentsId,我们在创建窗口时就已知key,便可以很方便的用其获取webContentsId用于在渲染进程直接与另一个窗口的渲染进程进行通信。
主进程模块
1.补充窗口组元素的声明:
- electron\electron-env.d.ts
...
/** 一些仅在electron中使用的声明 */
declare global {// 窗口组interface WindowGroup {webContentsId: number; // 窗口的渲染层idwindowId: number; // 窗口id}
}
2.在窗口工具类中补充窗口组属性,并在构造方法中初始化
export class WindowUtils {group: Map<string, WindowGroup>; // 窗口组 key就是传入的key值,如果没传,则取窗口的id作为key值/*** 构造方法,初始化属性*/constructor() {this.group = new Map();}
}
3.在窗口新建的方法中补充逻辑:
- 创建窗口前补充通过key判断已有窗口则聚焦旧窗口逻辑
- 窗口创建后,补充逻辑将窗口信息和key添加到窗口组中
- 并在最后补充窗口的通用事件绑定方法,里面补充窗口关闭时清理掉在窗口组中对应的元素
/*** 创建窗口* @param windowConfig 窗口创建参数*/createWindows(windowConfig: IWindowConfig): BrowserWindow {// 先通过key判断是否已窗口,有则聚焦let windowKey = windowConfig.key;if (windowKey && windowKey.length > 0) {/// 先从窗口组中取出记录const wg: WindowGroup = this.group.get(windowKey);if (wg) {/// 根据记录中的窗口id获取窗口,假如存在该窗口,则聚焦该窗口const oldWin = BrowserWindow.fromId(wg.windowId);if (oldWin) {oldWin.focus();return oldWin;}}}// 创建窗口对象...// 将窗口的关键信息与key关联,存入窗口组中windowKey = windowKey || win.id.toString();this.group.set(windowKey, {windowId: win.id,webContentsId: win.webContents.id,});// 根据当前环境加载页面,并传递参数...// 绑定通用窗口事件this.bindWindowEvent(win, windowConfig);console.log(this.group);return win;}/*** 绑定窗口事件* @param win 窗口对象* @param windowConfig 窗口创建参数*/bindWindowEvent(win: BrowserWindow, windowConfig: IWindowConfig) {// 窗口关闭监听,此事件触发时,窗口即将关闭,可以拒绝关闭,此时窗口对象还未销毁win.on("close", () => {/// 设置窗口透明win.setOpacity(0);/// 在窗口组中删除const key = windowConfig.key || win.id.toString();this.group.delete(key);});// 此事件触发时,窗口已关闭,窗口对象已销毁win.on("closed", () => {// 在窗口对象被关闭时,取消订阅所有与该窗口相关的事件win.removeAllListeners();// 引用置空win = null;});}
3.应用启动后的第一个窗口我们把它当做主窗口,也补充个唯一key =>main,方便区分其他窗口
- electron\main\index.ts
win = windowUtils.createWindows({route:"/",key:'main'});
渲染进程模块
我们渲染进程创建窗口时传入key
- src\components\demo\Index.vue
<template> <input v-model="windowKey" placeholder="输入新建窗口的key"/>
</template>
<script setup lang="ts">... const windowKey = ref("");...electronUtils.createWindow({route: windowPath.value,key:windowKey.value,param: JSON.stringify({message: "向你问个好~~",}),});
</script>
测试效果
- 没有传入key时,默认用窗口id作为窗口组中元素的key
- 窗口销毁时,元素正常从窗口组中移除
- 传入相同的key时,旧窗口被聚焦

相关文章:
electron+vue3全家桶+vite项目搭建【28】封装窗口工具类【2】窗口组,维护窗口关系
文章目录 引入实现效果思路主进程模块渲染进程模块测试效果 引入 demo项目地址 窗口工具类系列文章: 封装窗口工具类【1】雏形 封装窗口工具类【2】窗口组,维护窗口关系 封装窗口工具类【3】控制窗口定向移动 我们思考一下窗口间的关系,窗…...
docker安装ES和kibana
文章目录 一、安装Elasticsearch1. 安装Elasticsearch2. 安装IK分词器3. elasticsearch-head 监控的插件4. 配置跨域 二、安装kibana 提示:以下是本篇文章正文内容,下面案例可供参考 一、安装Elasticsearch 1. 安装Elasticsearch 安装Elasticsearch参…...
uniapp微信小程序获取当前位置
uni-app微信小程序uni.getLocation获取位置;authorize scope.userLocation需要在app.json中声明permission;小程序用户拒绝授权后重新授权-CSDN博客...
HarmonyOS创建项目和应用—设置数据处理位置
项目和应用介绍 关于项目 项目是资源、应用的组织实体。资源包括服务器、数据库、存储,以及您的应用、终端用户的数据等。在您使用部分服务时,您是数据的控制者,数据将按照您设置的数据处理位置来存储在指定区域。 通常,您不需…...
3.1_2024ctf青少年比赛部分web题
php后门 根据x-powered-by知道php的版本 该版本存在漏洞: PHP 8.1.0-dev 开发版本后门 根据报错信息,进行提示,前 GET / HTTP/1.1 Host: challenge.qsnctf.com:31639 User-Agentt:12345678system(cat /flag);var_dump(2*3);zerodium12345678…...
Vue3:OptionsAPI 与 CompositionAPI的比较
1、Vue2 Vue2的API设计是Options(配置)风格的。 Options API 的弊端 Options类型的 API,数据、方法、计算属性等,是分散在:data、methods、computed中的,若想新增或者修改一个需求,就需要分别…...
Rust! 无VDom! 尤雨溪解析 Vue.js 2024 新特性
视频号搜索“云前端”观看视频版 在 VueJS Amsterdam 2024 大会首日,Vue 创始人 Evan You 进行了开场主旨演讲。他首先回顾了 Vue 十年以来的累累硕果,指出 VueJS 从一个视图层工具,成功演化出全流程的社区生态。 Vue 3.4 谈到 Vue 3 的发展时…...
Windows上websocket客户端连接定时存储消息到文件并加载文件定时发送服务端工具实现
场景 在业务开发中,需要对接三方websocket协议数据或者连接并存储线上websocket协议数据,需要使用websocket客户端 连接线上的websocket服务端获取并存储数据,然后将数据存储成文件格式可移植,并将数据复制 到本地,…...
【STM32+OPENMV】二维云台颜色识别及追踪
一、准备工作 有关OPENMV最大色块追踪及与STM32通信内容,详情见【STM32HAL】与OpenMV通信 有关七针OLED屏显示内容,详情见【STM32HAL】七针OLED(SSD1306)配置(SPI版) 二、所用工具 1、芯片:STM32F407ZGT6 2、CUBEMX配置软件 3、KEIL5 4…...
JavaScript基础3之面向对象关于面向过程、函数式编程、对比、构造函数、原型
JavaScript基础 面向对象面向过程函数式编程命令式编程函数式编程特性副作用透明引用不可变变量函数是一等公民 常见的函数式编程模型 面向对象为什么要使用面向对象封装继承多态 对比面向过程函数式编程面向对象 构造函数原型constructor使用场景 对象原型 面向对象 面向过程…...
运用Tensorflow进行目标检测
对象检测是一种计算机视觉技术,它使软件系统能够从给定的图像或视频中检测、定位并跟踪物体。对象检测的一个特殊属性是它能识别对象的类别(如人、桌子、椅子等)并在给定图像中指出其具体位置坐标。这个位置通常通过在物体周围绘制一个边界框…...
【源码】imx6ull实现触摸屏单点实验-移植tslib和qt
一、本实验实验的器材: 1.正点原子imx6ull的阿尔法开发板v2.2 2.屏幕ALIENTEK 4.3 RGBLCD 二、实验已经移植好的文件: 仓库代码:https://gitee.com/wangyoujie11/atkboard_-linux_-driver.git 1.文件说明 arm-qt.tar.bz2:移植好的…...
【JSON2WEB】07 Amis可视化设计器CRUD增删改查
总算到重点中的核心内容,CRUD也就是增删改查,一个设计科学合理的管理信息系统,95%的就是CRUD,达不到这个比例要重新考虑一下你的数据库设计了。 1 新增页面 Step 1 启动amis-editor Setp 2 新增页面 名称和路径随便命名…...
ThreeJs同一个场景多个相机的显示
在threeJs开发数字孪生中,我们正常是需要使用一个相机,画面显示的内容也就是这个相机拍摄到的内容,但是是否可以添加多个相机,可以同时从不同角度观察模型呢,实际上是可以的,不过多个相机的拍摄到的画面肯定…...
Vue基础篇
Vue Vue是一套用于构建用户界面的渐进式JavaScript框架 什么是渐进式? Vue可以自底向上逐层地应用; 当构建简单应用时, 只需一个轻量小巧的核心库; 当构建复杂应用时, 可以引入各式各样的Vue插件 Vue具有以下特点: 采用组件化模式, 提高代码复用率且让代码更好维护 声明式编…...
计算机视觉基础知识(十六)--图像识别
图像识别 信息时代的一门重要技术;目的是让计算机代替人类处理大量的物理信息;随着计算机技术的发展,人类对图像识别技术的认识越来越深刻;图像识别技术利用计算机对图像进行处理\分析\理解,识别不同模式的目标和对象;过程分为信息的获取\预处理\特征抽取和选择\分类器设计\分…...
数仓开发-2023/2/29
1.简单自我介绍 2.介绍下之前的公司离线数仓项目 3.sql和hivesql区别? 4.sql的执行顺序? 5.hive的优化 6.说下你之前公司来,你的技能层次在每个公司?你怎么评价你的技能? 7.你的之前业务主要是做什么?我说了…...
ipv6过渡技术-IPv4 over IPv6隧道示例
实验拓扑如下: 环境概述: PC1和PC2与路由器之间为IPv4网络。两台路由器之间为IPv6网络,通过配置,要求是PC1与PC2能互通。即使IPv4可以在IPv6网络中通信。 配置方法: AR1: # ipv6 # interface Gigabi…...
SpringBoot约定大于配置
什么是约定大于配置 "约定大于配置"(Convention Over Configuration)是一种理念,旨在通过默认约定和规则来减少开发人员需要做的配置工作。在Spring Boot框架中,这一原则得到了充分应用,帮助开发者更快地构…...
DHCP自动获取IP地址实验(华为)
思科设备参考:DHCP自动获取IP地址实验(思科) 一,实验目的 路由器搭载DHCP,让PC通过DHCP自动获取IP地址 二,不划分vlan--全局地址池 实验拓扑 配置命令 Router <Huawei>system-view [Huawei]ip po…...
ComfyUI-Impact-Pack V8:AI图像增强的模块化架构革新与性能突破
ComfyUI-Impact-Pack V8:AI图像增强的模块化架构革新与性能突破 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地址:…...
暗黑破坏神2存档编辑器终极指南:5分钟掌握Diablo Edit2核心功能
暗黑破坏神2存档编辑器终极指南:5分钟掌握Diablo Edit2核心功能 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否曾经因为暗黑破坏神2中角色技能点分配失误而苦恼?是否…...
GRBL-Plotter完全指南:从创意到实物的智能数控转换方案
GRBL-Plotter完全指南:从创意到实物的智能数控转换方案 【免费下载链接】GRBL-Plotter A GCode sender (not only for lasers or plotters) for up to two GRBL controller. SVG, DXF, HPGL import. 6 axis DRO. 项目地址: https://gitcode.com/gh_mirrors/gr/GR…...
Zabbix 7.0 在 Ubuntu 上启用中文界面语言(zh_CN)
Zabbix 7.0 配置中文选项(zh_CN) 适用于 Zabbix 7.0 系统默认情况下语言文件不包含中文的情况。环境说明 Zabbix 版本:7.0.15(LTS)问题现象 Language 下拉框中 Chinese (zh_CN) 是灰色不可选;原因是系统未安…...
深度解析TranslucentTB运行时依赖问题的创新解决方案
深度解析TranslucentTB运行时依赖问题的创新解决方案 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentTB是一款广受欢迎的Wind…...
为什么你的Perplexity返回过时新闻?环境时区、缓存策略与源权重配置三重校准指南
更多请点击: https://intelliparadigm.com 第一章:为什么你的Perplexity返回过时新闻?环境时区、缓存策略与源权重配置三重校准指南 Perplexity 的实时新闻响应延迟,常被误认为模型能力缺陷,实则源于底层检索链路中三…...
原子制造:从单原子操控到新材料创制的技术原理与应用
1. 原子制造:从宏观“锤子”到微观“镊子”的范式革命我们常说,人类文明史是一部材料史。从打磨石器的旧石器时代,到熔铸青铜的青铜时代,再到锻造钢铁的工业时代,每一次文明的跃迁,都伴随着我们对物质操控能…...
硬件开发、智能硬件与硬件系统:从概念到产品的完整技术解析
1. 项目概述:从“黑盒子”到“白盒子”的认知跃迁在科技行业摸爬滚打十几年,我见过太多对“硬件”这个词的误解。有人觉得硬件就是电脑、手机这些看得见摸得着的“铁疙瘩”;有人觉得智能硬件就是给传统设备加个Wi-Fi模块;还有人觉…...
HTML5语义化与现代Web标准
HTML5语义化与现代Web标准 1. 技术分析 1.1 HTML5概述 HTML5是现代Web的基础: HTML5特性语义化标签: header, footer, article多媒体支持: video, audio表单增强: date, email, number离线存储: localStorage, sessionStorage核心改进:语义化文档结构原生多媒体支持…...
异构计算与实时控制:FET536-C国产核心板的架构解析与工业应用实践
1. 项目概述:为什么FET536-C是国产嵌入式的新选择?最近,飞凌嵌入式联合全志科技发布的FET536-C全国产核心板,在圈子里引起了不小的讨论。作为一名在工业控制和嵌入式设备开发领域摸爬滚打了十几年的工程师,我对这类“全…...
