自定义菜单栏实现点击添加按钮打开渲染进程的Dialog.vue模态框

news/2024/11/17 14:01:59/

实现思路:渲染进程页面初始化后就通知主进程,然后把event事件保存在该js文件外,当点击添加时因为是在其他位置,所以才要这样使用。然后点击添加后由主进程主动向渲染进程传递参数通知要做的操作。

代码如下:

// 第一步// 进入主页面后给主进程通信 Home.vue
<script setup lang="ts" name="Home">import {provide, ref, onMounted} from 'vue'onMounted(async () => {window.getSource.openDialog()})</script>// preload.js
const {ipcRenderer, contextBridge} = require('electron')const openDialog = () => ipcRenderer.send('on-opendialog-event')contextBridge.exposeInMainWorld('getSource', {openDialog
})// 主进程 main.js
const { app, Menu, ipcMain } = require('electron')// 监听 on-opendialog-event 事件
let event = null
ipcMain.on('on-opendialog-event', (e, message) => {event = e;
})

// 第二步// 主进程内自定义菜单点击 添加 后触发事件
const { app, Menu, ipcMain } = require('electron')const isMac = process.platform === 'darwin'// 监听 on-opendialog-event 事件
let event = null
ipcMain.on('on-opendialog-event', (e, message) => {event = e;
})const template = [// { role: 'appMenu' }...(isMac? [{label: app.name,submenu: [{ role: 'about' },{ type: 'separator' },{ role: 'services' },{ type: 'separator' },{ role: 'hide' },{ role: 'hideOthers' },{ role: 'unhide' },{ type: 'separator' },{ role: 'quit' }]}]: []),// { role: 'fileMenu' }{label: 'File',submenu: [isMac ? { role: 'close' } : { role: 'quit' }]},// { role: 'editMenu' }{label: 'Edit',submenu: [{ role: 'undo' },{ role: 'redo' },{ type: 'separator' },{ role: 'cut' },{ role: 'copy' },{ role: 'paste' },...(isMac? [{ role: 'pasteAndMatchStyle' },{ role: 'delete' },{ role: 'selectAll' },{ type: 'separator' },{label: 'Speech',submenu: [{ role: 'startSpeaking' },{ role: 'stopSpeaking' }]}]: [{ role: 'delete' },{ type: 'separator' },{ role: 'selectAll' }])]},// { role: 'viewMenu' }{label: 'View',submenu: [{ role: 'reload' },{ role: 'forceReload' },{ role: 'toggleDevTools' },{ type: 'separator' },{ role: 'resetZoom' },{ role: 'zoomIn' },{ role: 'zoomOut' },{ type: 'separator' },{ role: 'togglefullscreen' }]},// { role: 'windowMenu' }{label: 'Window',submenu: [{ role: 'minimize' },{ role: 'zoom' },...(isMac? [{ type: 'separator' },{ role: 'front' },{ type: 'separator' },{ role: 'window' }]: [{ role: 'close' }])]},{role: 'help',submenu: [{label: 'Learn More',click: async () => {const { shell } = require('electron')await shell.openExternal('https://electronjs.org')}}]},// 第一步看这个就可以{label: 'action',submenu: [{label: '添加(打开dialog)',click: () => {// 作用: 主进程通知渲染进程// 点击后主进程触发preload预加载内对应的事件,然后渲染进程触发打开弹窗event.sender.send('on-renderer-event', 'add')}}]},
]const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu)// preload.js处理主进程的事件event.sender.send('on-renderer-event', 'add')
const {ipcRenderer, contextBridge} = require('electron')const openDialog = () => ipcRenderer.send('on-opendialog-event')const onRendererEvent = () => {return new Promise((resolve, reject) => {ipcRenderer.on('on-renderer-event', (e, message) => {// 主进程通知后就触发这个回调resolve(message)})})
}contextBridge.exposeInMainWorld('getSource', {openDialog,onRendererEvent
})// 最后渲染进程Home.vue接收到传来的add,对类型进行监听后弹窗
<script setup lang="ts" name="Home">import {provide, ref, onMounted} from 'vue'let type = ref('');onMounted(async () => {window.getSource.openDialog()// 主进程触发preload,preload通知这里执行const res = await window.getSource.onRendererEvent()type.value = res;})</script><template><main><div>home</div><SearchBar :type="type" /><List /></main>
</template>// Searbar.vue监听type的值
<script setup lang="ts" name="SearchBar">import {ref, inject, watch} from 'vue'import Dialog from './Dialog.vue'const props = defineProps(['type'])const {show, setShow} = inject('on-show-event', {show: false, setShow: () => {}})function handleShowDialog () {setShow()}// 这里监听watch(() => props.type, () => {if (props.type == 'add') {handleShowDialog();}})
</script><template><div class="search_bar"><div @click="handleShowDialog">+</div><input placeholder="请输入关键词" type="text"></div><Dialog></Dialog></template><style lang="less" scoped>.search_bar {width: 100%;display: flex;align-items: center;height: 60px;background-color: #ccc;> div {margin-left: 20px;background-color: aqua;width: 16px;height: 16px;display: flex;align-items: center;justify-content: center;margin-right: 20px;}> input {flex: 1;}}
</style>

效果如下:


http://www.ppmy.cn/news/1547731.html

相关文章

探索KubeVirt:如何利用InfiniBand提升虚拟机性能

在高性能计算&#xff08;HPC&#xff09;中&#xff0c;网络性能对于集群效率起着至关重要的作用。为了支持大规模并行计算&#xff0c;HPC集群通常依赖高带宽、低延迟的网络&#xff0c;而InfiniBand&#xff08;IB&#xff09;正是其中的首选技术。它能够提供超过100Gbps的带…

多目标优化算法:多目标黑翅鸢算法(MOBKA)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6,提供完整MATLAB代码

一、黑翅鸢算法介绍 黑翅鸢优化算法&#xff08;Black-winged Kite Algorithm, BKA&#xff09;是2024年提出的一种元启发式优化算法&#xff0c;其灵感来源于黑翅鸢的迁徙和捕食行为。这种算法通过模拟黑翅鸢在捕食过程中的飞行和搜索策略&#xff0c;被用来解决优化问题&…

Scala-字符串(拼接、printf格式化输出等)-用法详解

Scala 一、 使用 号连接字符串 在 Scala 中&#xff0c; 运算符实际上会调用 String 类的 concat 方法或者使用字符串的加法操作&#xff0c;生成一个新的字符串。 字符串是不可变的&#xff0c;每次拼接都会创建一个新的字符串。 Mr. yuTips&#xff1a; 性能相对较差&…

【web前端笔记】vue3 + vite的前端项目中,使用import.meta.glob()方法实现全局注册组件的通用代码

目录 1.1、如何读取所有文件 1.2、通用代码 1.3、在main.js引入 这篇文章介绍一下,在vue3和vite搭建的项目中,如何将【src/components】目录下所有的【*.vue】文件,当做一个组件全局注册到Vue对象里面。 1.1、如何读取所有文件 在vue3和vite搭建的项目里面,它给我们提…

爬虫如何解决短效代理被封的问题?

在数据采集的征途上&#xff0c;短效代理如同一把双刃剑&#xff0c;它既能为我们带来速度和效率&#xff0c;也可能因为频繁更换IP地址而遭遇被封禁的风险。那么&#xff0c;作为数据采集er的我们&#xff0c;该如何巧妙应对&#xff0c;确保爬虫的稳定运行呢&#xff1f;今天…

MyBatis CRUD快速入门

3. CRUD操作 3.1. namespace 配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名 3.2. select select标签是mybatis中最常用的标签之一select语句有很多属性可以详细配置每一条SQL语句 id 命名空间中唯一的标识符接口中的方法名与映射文件中的SQL语句ID 一一…

方法论-WPS模型(高效沟通和决策分析的框架)

WPS模型&#xff08;What, Problem, Solution&#xff09;是一种高效沟通和决策分析的框架&#xff0c;旨在帮助沟通者清晰、简洁地表达问题和解决方案&#xff0c;特别适用于在复杂或多变的环境中进行清晰的交流。WPS模型的核心是通过以下三个步骤来组织沟通内容&#xff1a; …

SpringBootTest常见错误解决

1.启动类所在包错误 问题 由于启动类所在包与需要自动注入的类的包不在一个包下&#xff1a; 启动类所在包&#xff1a; com.exmaple.test_02 但是对于需要注入的类却不在com.exmaple.test_02下或者其子包下&#xff0c;就会导致启动类无法扫描到该类&#xff0c;从而无法对…