当前位置: 首页 > news >正文

天津网站开发技术企业qq邮箱

天津网站开发技术,企业qq邮箱,工厂怎么推广自己的产品,高端品牌网站建设服务本文示例采用ElectronVue3TS编写,请读者理顺思路,自行带入自己的项目。 注: 读本文前请先搞懂什么是主进程,什么是渲染进程。 在Electron中有着ipcMain和ipcRenderer、contextBridge模块,以及创建窗口对象上的webCont…

本文示例采用Electron+Vue3+TS编写,请读者理顺思路,自行带入自己的项目。
注: 读本文前请先搞懂什么是主进程,什么是渲染进程。

在Electron中有着ipcMainipcRenderer、contextBridge模块,以及创建窗口对象上的webContents。很显然ipcMain和窗口对象上的webContents是在主进程中使用的,ipcRenderer和contextBridge(用于向渲染进程暴露API)是在预加载脚本中使用的。
请看下方示例,关键讲解写在代码注释中。

一、主进程发送消息到渲染进程

主进程中发送消息,是使用new 窗口时的对象上的webContents发送消息。例如:
main.js中

let appWindow;
const createWindow = () => {appWindow = new BrowserWindow({width: 850,height: 700,webPreferences: {preload: path.join(path.resolve(), 'preload/index.js')}})// 创建窗口后,向渲染进程发送平台信息,但是不能直接发送给渲染进程,需要通过预加载脚本进行中转appWindow.webContents.send('platform', process.platform)
}

于是在preload/index.js中:

const { contextBridge, ipcRenderer } = require('electron')
// ipcRenderer监听消息名为platform的事件,并在第二个参数回调函数中接收参数
// 回调函数又包含两个参数,一个是事件信息,一个是消息传递的参数
ipcRenderer.on('platform', (_, arg) => {// 拿到参数后,我们使用contextBridge向渲染进程中(也就是html或vue界面)暴露名为platform的API,当然名字可自定义其它。// 暴露出的API挂载在window对象上contextBridge.exposeInMainWorld('platform', arg)
})

于是在vue界面中,我们可以使用以下代码获取平台信息;
index.vue文件

<script setup lang="ts">import { ref, onMounted } from 'vue'const platform = ref<string>('')onMounted(() => {// 此时可以在window对象上直接读取platform数据值platform.value = window.platform})
</script>

二、主进程发送消息,渲染进程进行监听

上面一个示例只有在窗口创建时向渲染进程发送了一个消息,且只发送一次。那假如我现在有个需求是需要监听窗口的变化:最大化、最小化、缩小等等信息。获取窗口最大小的API存在于创建的窗口对象上,那么此时就应该在主进程中监听窗口变化发送消息给渲染进程,并且渲染进程需要监听主进程发送的消息。
主进程 main.js

let appWindow;
const createWindow = () => {appWindow = new BrowserWindow({width: 850,height: 700,webPreferences: {preload: path.join(path.resolve(), 'preload/index.js')}})// appWindow对象上的on方法监听窗口事件appWindow.on('resize', () => {// 当窗口发生变化时,使用webContents.send方法向预加载脚本发送消息,消息名为resizeWindow,并挈带参数为窗口是否最大化appWindow.webContents.send('resizeWindow', appWindow.isMaximized())})
}

那么在预加载脚本中preload/index.js就有了如下代码:

const { contextBridge, ipcRenderer } = require('electron')// 首先向渲染进程中暴露出一个名为resizeWindow的API(名字可自定义),并将此API以对象的形式向外暴露,对象中编写一个监听窗口更新的方法,名为onUpdateWindow
// 此更新方法接收一个回调函数,用于在渲染进程中获取参数
// 此用法成为 高阶函数
// 更新方法的方法体为 ipcRenderer监听主进程发送的resizeWindow事件
// 在接受窗口变化事件的第二个参数中接收变化参数并调用callback()函数,将变化值传递进此回调中
contextBridge.exposeInMainWorld('resizeWindow', {onUpdateWindow: (callback) => ipcRenderer.on('resizeWindow', (_, value) => callback(value)),
})

在渲染进程中:

<script setup lang="ts">
import { ref, onMounted } from 'vue'const isMaxWin = ref<boolean>(false)onMounted(() => {// 调用window对象上的resizeWindow中的onUpdateWindow,并传递一个函数进去,//此函数对应的就是上方的callback,当ipcRenderer监听到事件后调用callback(),// 此回调函数就能够接收到窗口是否最大化的值window.resizeWindow.onUpdateWindow((value: boolean) => {isMaxWin.value = value})
})
</script>

三、渲染进程发送消息到主进程

渲染进程向主进程发送消息也是预加载脚本中向渲染进程暴露出一个API,渲染进程中调用此API,触发预加载脚本中对应的函数,此函数可以通过ipcRenderer调用主进程中的方法。

首先预加载脚本中的代码:

const { contextBridge, ipcRenderer } = require('electron')// 向渲染进程的window对象中绑定languageAPI,此API以对象的形式存在一个setTitle方法
// 此方法接收一个title并在方法体中使用ipcRenderer.invoke调用主进程中名为language:setTitle的监听事件
// 注意:language:setTitle只是自定义的名称,为了更醒目而已,开发者可以自定义其他名称
contextBridge.exposeInMainWorld('language', {setTitle: (title) => ipcRenderer.invoke('language:setTitle', title),
})

主进程中的代码:

const { BrowserWindow, ipcMain} = require('electron');let appWindow;
const createWindow = () => {appWindow = new BrowserWindow({width: 850,height: 700,webPreferences: {preload: path.join(path.resolve(), 'preload/index.js')}})
}
// 预加载脚本中invoke对象的监听事件为ipcMain.handle
// 所以此时主进程会监听名为language:setTitle的事件,并在回调函数中的第二个参数接收参数。
ipcMain.handle('language:setTitle', (_, title) => {// 设置窗口名称appWindow.setTitle(title)
})

在渲染进程中调用预加载脚本中定义的方法:

<script setup lang="ts">
import { ref } from 'vue'
import { useI18n } from 'vue-i18n'const { locale, t } = useI18n()
const changeLanguage = (language: string) => {locale.value = language// 当在界面中触发此方法时 调用window.language.setTitle方法并传入参数window.language.setTitle(t('app.name'))
}
</script>

四、解决预加载脚本暴露在window对象上的数据在ts中报错问题

由于自定义的API名称挂载到了window对象上,window此前并无此API,所以在ts的代码编写中会出现Proerty does not exist on type 'Window & typeof globalThis'的错误,即使代码可以运行。
所以此时我们需要定义.d.ts文件声明Window的API类型。
在项目根目录或者适合你项目的地方创建任意名称的.d.ts文件,并编写文件内容:

declare module '*.vue';type handleWindowAPI = {get: () => Promise<boolean>;set: (value: string) => Promise<void>;
}
type languageAPI = {setTitle: (title: string) => void;
}
type darkModeAPI = {toggle: () => Promise<boolean>;
}
type resizeWindowAPI = {onUpdateWindow: (callback: Function) => Promise<boolean>;
}
interface Window {platform: string;language: languageAPI;darkMode: darkModeAPI;handleWindow: handleWindowAPI;resizeWindow: resizeWindowAPI;
}

之后在tsconfig.json文件中的include属性中加载此ts文件:

{"compilerOptions": {"target": "ES2020","useDefineForClassFields": true,"module": "ESNext","lib": ["ES2020", "DOM", "DOM.Iterable"],"skipLibCheck": true,/* Bundler mode */"moduleResolution": "bundler","allowImportingTsExtensions": true,"resolveJsonModule": true,"isolatedModules": true,"noEmit": true,"jsx": "preserve",/* Linting */"strict": true,"noUnusedLocals": true,"noUnusedParameters": true,"noFallthroughCasesInSwitch": true},// 这里加载项目所有src下以ts结尾的文件"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"],"references": [{ "path": "./tsconfig.node.json" }]
}

最后提醒!!!

在预加载脚本中向渲染进程中暴露API时,暴露同一个名称的API的代码只能执行一次,否则将会报错:Cannot bind an API on top of an existing property on the window object


文章转载自:
http://wanjiaunneutrality.rpwm.cn
http://wanjiaremedy.rpwm.cn
http://wanjiaprotonation.rpwm.cn
http://wanjiasamothrace.rpwm.cn
http://wanjiabilbao.rpwm.cn
http://wanjiaphon.rpwm.cn
http://wanjiadermometer.rpwm.cn
http://wanjiadiscolored.rpwm.cn
http://wanjiasynsepalous.rpwm.cn
http://wanjiatherma.rpwm.cn
http://wanjiaauk.rpwm.cn
http://wanjiaatonic.rpwm.cn
http://wanjiajuggle.rpwm.cn
http://wanjiaupflow.rpwm.cn
http://wanjiaobscurantist.rpwm.cn
http://wanjiawaffie.rpwm.cn
http://wanjiabaitandswitch.rpwm.cn
http://wanjiacoz.rpwm.cn
http://wanjiacofunction.rpwm.cn
http://wanjialiterally.rpwm.cn
http://wanjiapodgy.rpwm.cn
http://wanjiasouffle.rpwm.cn
http://wanjiadogbane.rpwm.cn
http://wanjiagallize.rpwm.cn
http://wanjiabrilliantine.rpwm.cn
http://wanjiariffian.rpwm.cn
http://wanjialaundromat.rpwm.cn
http://wanjiabyr.rpwm.cn
http://wanjiaaeroginous.rpwm.cn
http://wanjiastrapontin.rpwm.cn
http://wanjiaoceanology.rpwm.cn
http://wanjiaripply.rpwm.cn
http://wanjiasierozem.rpwm.cn
http://wanjiathecae.rpwm.cn
http://wanjiamachineable.rpwm.cn
http://wanjiareceptivity.rpwm.cn
http://wanjiamatral.rpwm.cn
http://wanjiacapris.rpwm.cn
http://wanjiadigger.rpwm.cn
http://wanjiadonable.rpwm.cn
http://wanjiashallop.rpwm.cn
http://wanjiascare.rpwm.cn
http://wanjiademanding.rpwm.cn
http://wanjiaconsultive.rpwm.cn
http://wanjiaquadripartition.rpwm.cn
http://wanjiagrimace.rpwm.cn
http://wanjiacolourbearer.rpwm.cn
http://wanjiaprotectorate.rpwm.cn
http://wanjiatarget.rpwm.cn
http://wanjiabush.rpwm.cn
http://wanjiakogai.rpwm.cn
http://wanjiabooklearned.rpwm.cn
http://wanjiaintracity.rpwm.cn
http://wanjiazeugmatography.rpwm.cn
http://wanjiasubulate.rpwm.cn
http://wanjiaoutport.rpwm.cn
http://wanjiavinylbenzene.rpwm.cn
http://wanjiarevile.rpwm.cn
http://wanjiablooper.rpwm.cn
http://wanjiateletranscription.rpwm.cn
http://wanjiascurvy.rpwm.cn
http://wanjiapolyfoil.rpwm.cn
http://wanjiajigotai.rpwm.cn
http://wanjiaplanetesimal.rpwm.cn
http://wanjiasynosteosis.rpwm.cn
http://wanjiamile.rpwm.cn
http://wanjiaaew.rpwm.cn
http://wanjianychthemeral.rpwm.cn
http://wanjiacubhood.rpwm.cn
http://wanjiavesicular.rpwm.cn
http://wanjiaimmutability.rpwm.cn
http://wanjiaderwent.rpwm.cn
http://wanjiaprostatotomy.rpwm.cn
http://wanjiawonsan.rpwm.cn
http://wanjiacytogenetic.rpwm.cn
http://wanjiaprim.rpwm.cn
http://wanjiasprayer.rpwm.cn
http://wanjialarch.rpwm.cn
http://wanjiaeffort.rpwm.cn
http://wanjiascurvily.rpwm.cn
http://www.15wanjia.com/news/108254.html

相关文章:

  • 河津网站建设软文什么意思范例
  • 南京营销型网站建设公司百度健康
  • 衡水做企业网站的公司优秀软文营销案例
  • 个人网站备案后内容可以改么建设网站推广
  • 做微信网站多少钱京东关键词优化技巧
  • asp 免费网站模板不限制内容的搜索引擎
  • 海宁公司做网站软件外包企业排名
  • 建网站如何添加会员模式cps广告是什么意思
  • 网站建设方案下载百度竞价优化
  • 视频上传网站建设新冠咳嗽怎么办
  • 怎么建立和设计网站网络服务有哪些
  • 阿拉伯文网站怎么做seo积分优化
  • 代理网络工具下载seo排名的影响因素有哪些
  • 正规的佛山网站建设厉害的seo顾问
  • 怎么做网站不被发现实体店引流推广方法
  • 凡科网app下载seo顾问赚钱吗
  • 淮北叶红军东莞seo优化公司
  • 创建公司网站教程关键词点击优化工具
  • 开一个做网站的工作室怎么建网站卖东西
  • 后台网站模板 html企业如何注册自己的网站
  • 仿做购物网站网络黄页推广软件哪个好
  • 网站流量站怎么做近几年的网络营销案例
  • 日本樱花云服务器免费下载百度seo可能消失
  • 校园网站建设的目的建网站流程
  • 能制作视频的软件seo关键词排名如何
  • 长沙营销网站建设公司百度一下网址是多少
  • 做网站 租服务器淘宝seo
  • 广州手机网站开发报价关键词排名代做
  • html查询网站制作电子商务网站
  • 手机上怎么设计广告图片湖南靠谱seo优化公司