electron+vue3全家桶+vite项目搭建【13】封装加载进度显示,新建窗口 演示主进程与渲染进程通信

news2024/9/22 5:15:49

文章目录

    • 引入
    • 实现效果演示:
    • 1.封装新建窗口工具
    • 2.测试新建窗口
    • 3.封装进度条加载
    • 4.测试进度条加载

引入

这里我们通过封装electron的工具类来演示electron中的主进程和渲染进程利用ipc进行通信

demo项目地址

electron官方文档ipc通信

实现效果演示:

创建窗口
请添加图片描述

进度条加载

请添加图片描述

1.封装新建窗口工具

1.我们首先在electron目录下的main.ts中补充主进程窗口打开代码:

  • 如果用的是electron-vite模板工程生成,可以看到104行左右已经给我们创建了一个窗口打开处理器
  • 可以看到,这里实际就是让新窗口显示我们路由对应的网站
// electron\main\index.ts   
// 【异步通信】 ipcMain.handle 对应 ipcRender.invoke    主进程可直接return,渲染进程接收promise
// 【同步通信】 ipcMain.on 对应 ipcRender.sendSync    主进程 evnet.returnValue =xxx ,  渲染进程直接=返回值即可
// 这里接收的第一个参数默认为 事件参数,可以取到发送窗口的一些信息,这里没有用到,所以直接用 _ 占位
ipcMain.handle("open-win", (_, arg) => {
  const childWindow = new BrowserWindow({
    webPreferences: {
      preload,
      nodeIntegration: true,
      contextIsolation: false,
    },
  });

  if (process.env.VITE_DEV_SERVER_URL) {
    childWindow.loadURL(`${url}#${arg}`);
  } else {
    childWindow.loadFile(indexHtml, { hash: arg });
  }
});

请添加图片描述

2.我们在src目录下新建一个utils目录,然后创建一个electronUtils.ts文件:

import { ipcRenderer } from "electron";

/**
 * 新建一个窗口
 * @param path 路由地址
 */
export function openWindow(path: string) {
  ipcRenderer.invoke("open-win", path);
}

export default {
  openWindow,
};

2.测试新建窗口

我们调整 src\components\demo\Index.vue 里的代码:

<template>
  <h1>这是demo页 当前计数为:{{ counterStore.counter }}</h1>
  <ul>
    <li><router-link to="/hello">链接跳转helloworld页</router-link></li>
    <li><router-link to="/demo/mockDemo">mockjs案例</router-link></li>
    <li><router-link to="/demo/mockApiDemo">前端模拟接口</router-link></li>
    <li><router-link to="/demo/sassDemo">sassDemo</router-link></li>
    <li>
      <el-select
        v-model="windowPath"
        value-key=""
        placeholder="输入路由地址"
        clearable
        filterable
      >
        <el-option
          v-for="path in routerPaths"
          :key="path"
          :label="path"
          :value="path"
        >
        </el-option>
      </el-select>
      <el-button @click="openWindow">新建窗口</el-button>
    </li>
  </ul>
</template>

<script setup lang="ts">
import { useRouter } from "vue-router";
import { useCounterStore } from "@store/counterStore";
import { ref } from "vue";
import electronUtils from "@/utils/electronUtils";

const counterStore = useCounterStore();
const router = useRouter();

const windowPath = ref("/hello");
const routerPaths = ref<string[]>([]);
// 取到所有的路径
routerPaths.value = router.getRoutes().map((item) => item.path);

function openWindow() {
  electronUtils.openWindow(windowPath.value);
}
</script>

<style scoped>
ul {
  list-style: none;
}
</style>

测试效果如下:

请添加图片描述

3.封装进度条加载

1.可以看到官网给了我们一个进度条显示案例:

进度条显示案例

我们也仿照着在 electron\main\index.ts 中补充代码:

/**
 * show : ture 显示app进度条,false,关闭显示
 */
let progressInterval;
ipcMain.handle("show-process", (event, show: boolean) => {
  const INCREMENT = 0.03;
  const INTERVAL_DELAY = 100; // ms

  let c = 0;
  if (show) {
    progressInterval = setInterval(() => {
      win.setProgressBar(c);
      if (c < 2) {
        c += INCREMENT;
      } else {
        c = -INCREMENT * 5;
      }
    }, INTERVAL_DELAY);
  } else {
    c = 0;
    win.setProgressBar(c);
    if (progressInterval) {
      clearInterval(progressInterval);
    }
  }
});

2.在src\utils\electronUtils.ts中封装方法,发送消息让主进程执行进度条显示/关闭:

/**
 * 显示加载进度条
 * @param isShow 是否显示加载进度条【底部工具栏图标显示】
 */
export function showProcess(isShow: boolean) {
  ipcRenderer.invoke("show-process", isShow);
}

export default {
  showProcess,
};

4.测试进度条加载

我们调整src\components\HelloWorld.vue的代码:

<script setup lang="ts">
import { ref } from "vue";
import electronUtils from "@/utils/electronUtils";

const showProcess = ref(false);

/**切换process 显示/隐藏 */
function switchProcess() {
  showProcess.value = !showProcess.value;
  electronUtils.showProcess(showProcess.value);
}
</script>

<template>
  <ul>
    <li>
       <el-button type="warning" @click="switchProcess">{{
        showProcess ? "关闭process" : "显示process"
      }}</el-button>
    </li>
  </ul>
</template>

<style scoped>
ul {
  list-style: none;
}
</style>

测试效果:
请添加图片描述

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

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

相关文章

通过注册表设置远程桌面的配置

***************************修改远程终端端口号*************************** [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Server\Wds\rdpwd\Tds\tcp] "PortNumber"dword:00000d3d [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Ser…

代码优雅之道——如何干掉过多的if else

1、前言 注意标题是过多的&#xff0c;所以三四个就没必要干掉了。实际开发中我们经常遇到判断条件很多的情况&#xff0c;比如下图有20多种情况&#xff0c;不用想肯定是要优化代码的&#xff0c;需要思考的是如何去优化&#xff1f; 网上很多说用switch case啊&#xff0c;首…

算法刷题|198.打家劫舍、213.打家劫舍Ⅱ、337.打家劫舍Ⅲ

打家劫舍 题目&#xff1a;你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定…

【社区图书馆】Fundamentals Of Computer Graphics——The beginning of computer graphics

目录 English 中文 English "Fundamentals Of Computer Graphics" is a classic textbook on computer graphics, also known as the "Tiger Book". It is considered one of the best introductory texts in the field of computer graphics. The book …

1分钟搭建自己的GPT网站

如果觉得官方免费的gpt&#xff08;3.5&#xff09;体验比较差&#xff0c;总是断开&#xff0c;或者不会fanqiang&#xff0c;那你可以自己搭建一个。但前提是你得有gpt apikey。年初注册的还有18美金的额度&#xff0c;4.1号后注册的就没有额度了。不过也可以自己充值。 有了…

【Redis】Redis事务

介绍 可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c; 按顺序地串行化执行而不会被其他命令插入一个队列中&#xff0c;一次性、顺序性、排他性的执行一系列命令没有隔离级别的概念&#xff0c;没有脏读、不可重复读等。 …

思维导图从入门到大神

思维导图怎么做&#xff1f;思维导图是一种发散性思维的图。在我们生活的方方面面都有运用。无论是工作、学习、还是生活&#xff0c;我们都可以用到它。那思维导图是怎么绘制的呢&#xff1f;其实非常简单&#xff0c;只要这简单的几步 1、首先在绘制思维导图前&#xff0c;我…

veImageX 演进之路:iOS 高性能图片加载 SDK

动手点关注 干货不迷路 1. SDK简介 图片在业务应用场景是一个常见的元素&#xff0c;veImageX&#xff08;简称ImageX&#xff09;为业务提供了灵活、高效的一站式图片处理解决方案&#xff0c;包括了服务端 SDK、上传 SDK 和客户端图片加载 SDK。本文就来介绍下 iOS 客户端图…

力扣 1493(删掉一个元素以后全为 1 的最长子数组)Java

目录 题目 约束 用例 解题思路 各位看官先看执行结果 这道题呢&#xff0c;采用的滑动窗口思想。 题目 给你一个二进制数组 nums &#xff0c;你需要从中删掉一个元素。 请你在删掉元素的结果数组中&#xff0c;返回最长的且只包含 1 的非空子数组的长度。 如果不存在…

15天学习MySQL计划-索引(进阶篇)第七天

索引 1.索引概述 1.介绍 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构&#xff08;有序&#xff09;。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数…

HTTP1.1(十二)Cookie的格式与约束

一 Cookie的格式与约束 ① Cookies是什么 1) cookie是我们在前端编程中经常使用的概念2) 使用cookie利用浏览器帮助我们保存客户的相关状态信息,保存用户已经做了什么事情3) 重点和难点[1]、cookie的工作原理[2]、cookie的限制是什么[3]、session又是怎样与cookie关联起来 …

【Android Framework (七) 】- ActivityManagerService(AMS)

文章目录 知识回顾启动第一个流程initZygote的流程system_serverServiceManagerBinderLauncher的启动 前言源码分析1.AMS的启动. ActivityManagerService.java2.setSystemProcess3.应用进程的初始化4.Activity的启动流程 拓展知识1.介绍一下Activity的启动流程。2.ActivityMana…

Handbook of MusicPsychology 音乐心理学手册 ( 多纳德·霍杰斯 Donald.A.Hodges) 笔记

由两个以上的音组成的结合音&#xff0c;除了该声波的波形&#xff0c;人耳会另外脑补出不存在的波形 频率相距较远的一些音与频率相距较近的一些音&#xff0c;前者累加的响度比后者要大 除了泛音部分&#xff0c;音的起声部分也是音色辨别的关键 音高、响度、音色、时值&a…

托福高频真词List07 // 附托福TPO阅读真题

目录 ​ 4月24日单词 生词 熟词 4月25日真题 4月24日单词 生词 &#x1f361;live in strictly aquatic habitat / əˈkwɑːtɪk / &#x1f361;only live in aquatic environment 只生活在水生环境中 readilyquickly readilyeasily adv 迅速地 adv 轻易地 wide…

聚观早报|中国将是ChatGPT主要对手;​iPhone 15将使用USB-C接口

今日要闻&#xff1a;中国将是ChatGPT主要对手&#xff1b;iPhone 15将使用USB-C接口&#xff1b;31名ChatGPT训练派遣工遭解雇&#xff1b;大疆Mavic 3 Pro无人机高清图曝光&#xff1b;中国红牛回应被禁止生产销售 中国将是ChatGPT主要对手 微软总裁布拉德史密斯接受采访时表…

前端开发之vue动态路由实现方案

前端开发之vue动态路由实现方案 前言2. 实现1、登录页面创建登录函数和watch监听路由2、调用的login方法&#xff08;1&#xff09;登录方法&#xff08;2&#xff09;存储token 3、router.push的时候调用路由守卫&#xff08;1&#xff09;创建路由守卫&#xff0c;建议路由守…

MySQL Community Server 8.0.33安装教程【笔记】

仅安装MySQL Community Server 下载网址&#xff1a;https://dev.mysql.com/downloads/installer/ 1、下载对应版本&#xff1b; 2、下载后&#xff0c;双击安装&#xff0c;弹出界面选择【Custom】&#xff1b; 3、弹出界面选择【MySQL Server 8.0.33 - X64】; 3、弹出界面…

【C++ Metaprogramming】0. 在C++中实现类似C#的泛型类

两年前&#xff0c;笔者因为项目原因刚开始接触C&#xff0c;当时就在想&#xff0c;如果C有类似C#中的泛型限定就好了&#xff0c;能让代码简单许多。我也一度认为&#xff1a; 虽然C有模板类&#xff0c;但是却没办法实现C#中泛型特有的 where 关键词&#xff1a; public c…

Android 13 wificond讲解

wificond介绍 看如下图,可以知道wificond 进程,该进程位于 system/connectivity/wificond 中。wificond 进程通过标准的 nl80211 命令与 Wi-Fi 驱动程序进行通信。 查看手机也能看到wificond 进程 wificond启动 1. 开机的时候通过调用wificond.rc文件启动wificond system…

docker 部署LNMP

准备工作。 #首先获取nginx配置文件 [rootlocalhost ~]# docker pull nginx:1.23.3 [rootlocalhost ~]# docker run --name nginx --restartalways -d -p 80:80 nginx:1.23.3 [rootlocalhost ~]# mkdir -p /usr/local/nginx/{conf,log,html,conf.d} #复制配置文件 [rootlocalh…