初学Electron

249 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

文件对象

  1. 引入node模块中的fs
const fs =require ('fs');
  1. 绑定对应的事件,阻止默认事件行为和防止事件传播
//绑定DOM对象监听
document.getElementById('XXX').οnclick=hello;
//ie中监听的方法
[object].attachEvent(“事件类型”,“处理函数”)//绑定
[object].detachEvent(“事件类型”,“处理函数”)//解绑
//标准Dom事件监听
e.addEventListener(“事件类型”,“处理函数”,“冒泡事件或捕获事件”)//绑定
e.removeEventListener(“事件类型”,“处理函数”,“冒泡事件或捕获事件”)//解绑
//默认事件行为
e.preventDefault()//取消浏览器对当前事件的默认行为
e.stopPropagation()//阻止事件在DOM中继续传播
  1. 事件处理函数
  fs.readFile('文件名包含后缀',(err,data)=>{
      //对应一些操作
    }

Dialog模块传送门

我使用的Electron18.0.4版本,在渲染进程中使用这个模块的时候出现控制台报错的问题,在这里总结下我的踩坑之道。 报错信息当然还有很多,这里就不一一列举........

TypeError: Cannot read properties of undefined (reading 'XXX')
  • 首先我检查一下看看是不是我的Remote模块是否安装成功(版本13禁用了Remote模块,所以要用下面方式下载新的包)
//安装失败的话就多试几次,国外所以......
yarn add @electron/remote
  • 然后就是在主进程文件中引入并初始化
require("@electron/remote/main").initialize();
  • 再之后就是在引入读取渲染进程的代码前初始化
 require("@electron/remote/main").enable(mainWindow.webContents);//这里的mainWindow不是固定的根据自己项目设置
  • 最后在子进程中引入并使用 引入
  const remote = require("@electron/remote")

使用

   //弹出信息框(配置对象中不止有type、title、buttons,还有很多具体可看文档)
    remote.dialog.showMessageBox({
      type: 'info',//可选
      title: '新增成功',//标题
      buttons:['YES','No']//按钮
    }).then((result)=>{
      console.log(result);//回调
    })

效果如下:

image.png

系统右下角通知消息 传送门

  • 引入(不多说)
  • 使用
let option={
      title: '通知',
      body:'新建成功'
    }
 new window.Notification(option.title,option).show()

效果如下:

image.png

异步任务&清除异步任务

有一种情况,我们在主线程中创建了一个窗口(非立即创建而是需要调用这个方法后的一段时间创建这个窗口)然后我们创建完了之后又想立即把它给删除了,不想让他在延时一段时间后显示,这时我们应该怎么做呢?实际上就需要我们在创建这个延时的窗口的时候传递过去一个参数,这个参数表示这个延时器(即这个延时串口的唯一标识)然后我们清除这个延时器就可以了

先来封装一个创建新窗口的函数

// 创建一个新的窗口
function createNewWindow (remindWindow) {//remindWindow为窗口名字的参数
  remindWindow = new BrowserWindow({
    height: 450,
    width: 360,
    resizable: false,//是否可以改变窗口尺寸默认ture
    frame: false,
    show: false,
    webPreferences:{
      nodeIntegration:true,
      contextIsolation: false,
    }
  })
  //窗口是否总是显示在其他窗口之前
  remindWindow.setAlwaysOnTop(true)//默认false
  remindWindow.loadURL(`file://${__dirname}/render/remind.html`)//新窗口的渲染进程(html文件)
  remindWindow.show()//显示这个窗口

接收子进程发送的消息,创建一个异步的任务(异步的窗口)

//main.js文件
const { BrowserWindow, ipcMain,  Menu } =require('electron') 
const { app, BrowserWindow,ipcMain } = require('electron')
// in the main process:  主进程引入并初始化,然后声明全局变量
require('@electron/remote/main').initialize()
// 部分 api 在 ready 事件触发后才能使用。
app.on('ready', () => {
  // 创建浏览器窗口
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    // 启用node下面的所有进程都可被使用
    webPreferences: {
      nodeIntegration: true,
      contextIsolation:false,//配合nodeIntegration加上整个控制台不会报require错误
      enableRemoteModule:true
    }
  })
  // 设置加载渲染的文件
  win.loadFile('index.html')
  // 打开开发者工具
  win.webContents.openDevTools()
})
//一段时间后创建窗口
ipcMain.on('setTaskTimer', (event, remindWindow,timeoutname) => {
  //5秒后创建
  timeoutname=setTimeout(() => {
    createRemindWindow(remindWindow)
  }, 5000)
})
//index.js
// 发送消息给主线程,让其创建一个延时的窗口
  const { ipcRenderer } = require('electron')
  ipcRenderer.send('setTaskTimer')

新创建的延时窗口渲染后我不能一直让他显示吧,该怎么办呢?

//main.js文件
  // 关闭提醒窗口
  remindWindow.on('closed', () => { remindWindow = null })
  // 设置提醒弹窗多久自动关闭
  setTimeout( () => {
    remindWindow && remindWindow.close()
  }, 2000)//延时2秒后关闭

新的延时窗口还未渲染前我不想让它渲染了,怎么搞?

  • 子渲染进程.html创建一个按钮
  • 子进程.js中获取节点绑定事件
 let mclear=this.document.querySelector('#clear')
   mclear.onclick = function () {
      ipcRenderer.send('clearNowtimeout')//给主进程发送消息立即删除异步未渲染的任务
    }
  • 主进程main.js添加
  //如果在渲染弹出框之前删除,则清除此弹出框定时器,不再创建此弹出框
  ipcMain.on('clearNowtimeout',()=>{
    clearTimeout(timeoutname)
  })

结果展示(延时5秒创建一个remind窗口,渲染后2秒自动关闭):

1.gif 结果展示(延时创建的窗口,没有渲染前,我点立即关闭,不再渲染)

2.gif