2、electron vue3 怎么创建子窗口,并给子窗口路由传参

接上回初始化vue3 electron项目,创建完vue3 electron项目后,现在要实现在渲染进程中点击按钮创建一个新的子窗口

开始

子窗口创建操作只能在主线程内完成,而创建操作是在渲染线程触发,因此就需要进行两者间的通讯。

1、创建子窗口

background.js

javascript 复制代码
//引入ipcMain
import { app, protocol,nativeImage, BrowserWindow,ipcMain } from 'electron'
...
...
// 创建提醒窗口
  function openChildWindow(e) {
    var childWin = new BrowserWindow ({
        width: 330,
        height:170,
        title:'待办提醒',
        alwaysOnTop:true,
        x:e.screenWidth-330,
        y:e.screenHeight-170,
        autoHideMenuBar: true,
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
        }
    })
    if (process.env.WEBPACK_DEV_SERVER_URL) {
      // 开发环境跳转路由,/remind就是配置的路由地址,并携带参数
      childWin.loadURL(process.env.WEBPACK_DEV_SERVER_URL + `#/remind?id=${e.id}`)
      if (!process.env.IS_TEST) childWin.webContents.openDevTools()
    } else {
      // 打包后跳转地址 /remind就是配置的路由地址
      createProtocol('app')
      childWin.loadURL(`app://./index.html#/remind?id=${e.id}`);
    }
    
    childWin.on("close", function(){
      childWin = null;
    })
  }
  // ipc通讯,触发创建操作
  ipcMain.on('on-open-event', (e,data) => {
    openChildWindow(JSON.parse(data))
  })

2、新建preload.js

javascript 复制代码
const { ipcRenderer } = require('electron');

window.myApi = {
    openWindow: (e) => {
        console.log(e);
        ipcRenderer.send('on-open-event',JSON.stringify(e))
    },
}

3、在background.js的创建主窗口配置中引入preload.js文件

javascript 复制代码
...
...
const win = new BrowserWindow({
    width: 400,
    height: 700,
    title:'待办记事本',
    frame: false, // 去掉窗口边框 // 取消默认的头部;自定义头部
    autoHideMenuBar: true, // 隐藏菜单栏
    autoHideMenuBar: true,
    icon:path.join(__dirname, '../public/logo.ico'),
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false,
      enableRemoteModule: true,
      preload: path.resolve(__dirname, "./preload.js")
    },
  })
...
...

4、在vue页面中调用,创建子窗口方法

javascript 复制代码
// 打开子窗口
function open(e){
    e.screenHeight = window.screen.height
    e.screenWidth = window.screen.width
    // e是我带过去的一些参数,不需要可以不用管,自行调整一下
    window.myApi.openWindow(e)
}
相关推荐
陈随易6 分钟前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
风骏时光牛马17 分钟前
前沿视界
前端
kyriewen21 分钟前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员
陈随易38 分钟前
3000 万人在用的翻译插件,重写一遍就是一门生意
前端·后端·程序员
IT_陈寒1 小时前
Vue的这个响应式陷阱,差点让我加班到天亮
前端·人工智能·后端
Flynt2 小时前
别写拖拽行为,只声明"能拖到哪":UIST 最佳论文的拖拽方案我实测了
前端·svg·preact
Moment3 小时前
代码都能让 Agent 写了,我们为什么还要学前端?
前端·后端·面试
Hilaku3 小时前
MCP 协议会成为前端 AI 工程的标准接口吗?
前端·javascript·程序员
Zan3 小时前
Tauri 2 实战:为什么一个可靠的桌面应用,应该由 Rust Host 管理生命周期?
前端·架构·rust
SameX3 小时前
鸿蒙 ArkTS 独立开发者的项目结构 model / dao / viewmodel / page / common 的分层
前端