• Electron+React如何进行通信


    目录

    前言:

    2.一些理解:

    3.数据交互

    4.前后端交互

    5.一些代码举例:


    前言:

    Electron是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序

    项目的技术栈为:Electron + React Hooks + typescript


    2.一些理解:

    这个项目分为三层,react(渲染层,前端)electron(中台,可以使用nodejs的一些基本系统功能,接收后端的数据给渲染层,将渲染层的请求给后端)-后端(处理数据,发送接收数据) 

    和正常的前后端分离不一样的是,多出了一个electron,而electron其实就是在react和后端之间的通信桥梁,后端接口先到electron,再通过electron通信给react,反之也是一样

    electron其实是一个桌面应用程序,不是一个标准的前端web程序,所有没有什么请求的发生,控制台network看不到请求,而是只能通过console.log去打印查看,而且通信协议使用的不是http而是gRPC协议


    3.数据交互

    以下三张图截取自Electron官网,在项目中使用非常频繁,且很重要

     

     


    4.前后端交互

     electron提供了ipcMainipcRenderer两个类进行通信。

    前端发送请求:

    其中 channel可以理解为调用的方法名,需要后端对该方法进行监听。

    1. const {ipcRenderer} = window.require('electron')
    2. ipcRenderer.send(channel, data)

    后端接受请求:

    1. const { ipcMain } = electron
    2. ipcMain.on(channel, (event, arg) => {
    3. # do something here
    4. })

    反过来:

    后端发送请求:

    其中mainWindow为项目启动时创建的窗口,如果创建了多个窗口,可以向指定的窗口发送请求。

    mainWindow.webContents.send(channel, data)


    前端监听请求

    1. const {ipcRenderer} = window.require('electron')
    2. ipcRenderer.on(channel, (event, arg) => {
    3. # do something here
    4. })

    5.一些代码举例:

    这是electron的文件用于向react通信,可以看到主要使用的是ipcMain这个对象

    1. const { ipcMain } = require("electron")
    2. module.exports = (win, getClient) => {
    3. ipcMain.handle("QueryYakScript", async (e, params) => {
    4. return await asyncQueryYakScript(params)
    5. })
    6. ipcMain.handle("DeleteYakScriptExecResult", async (e, params) => {
    7. return await asyncDeleteYakScriptExecResult(params)
    8. })
    9. }

     这是react的文件用于和electron通信,可以看到主要使用的是ipcRenderer这个对象,你会发现前后端没有直接交互,而均是通过electron这个“中间人”

    1. ipcRenderer.on(errorChannel, (e: any, error: any) => {
    2. setError(error)
    3. })
    4. ipcRenderer.on(endChannel, (e: any, data: any) => {
    5. info("模块加载完成 / 执行完毕")
    6. setExecuting(false)
    7. updateTasks()
    8. })

    这是electron和后端通信的接口

     

  • 相关阅读:
    Java-访问控制
    高德地图sdk设置marker并且将设置为地图中心
    k8s--基础--10.2--命令--kubectl--常用命令
    Stable Diffusion web UI 文档
    ToBeWritten之威胁狩猎环境应用
    在mac上使用jmap -heap命令报错:Attaching to process ID 96530, please wait...
    C/C++大写字母的判断 2021年6月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
    使用React Hooks实现表格搜索功能
    Client引入Eureka报Completed shut down of DiscoveryClient问题原因及解决方式
    Python文件操作(05):Excel操作
  • 原文地址:https://blog.csdn.net/wanghaoyingand/article/details/125507365