Electron+React如何进行通信

简介: Electron+React如何进行通信

前言:


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

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

1.一些理解:


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

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

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

2.数据交互


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

image.png

3.前后端交互


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)

前端监听请求

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

4.一些代码举例:


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

const { ipcMain } = require("electron")
module.exports = (win, getClient) => {
    ipcMain.handle("QueryYakScript", async (e, params) => {
        return await asyncQueryYakScript(params)
    })
    ipcMain.handle("DeleteYakScriptExecResult", async (e, params) => {
        return await asyncDeleteYakScriptExecResult(params)
    })
}

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

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

这是electron和后端通信的接口

image.png

相关文章
electron解决创建新窗口html文件不能引入ipcRenderer通信
electron解决创建新窗口html文件不能引入ipcRenderer通信
|
前端开发 调度
React(二) —— 组件间的通信方式
React(二) —— 组件间的通信方式
|
2月前
|
消息中间件 前端开发
React技术栈-组件间通信的2种方式
本文介绍了React技术栈中组件间通信的两种方式:通过props传递数据和使用消息发布(publish)-订阅(subscribe)机制,并通过实例代码展示了如何使用PubSubJS库实现跨组件通信。
54 11
React技术栈-组件间通信的2种方式
|
5月前
|
存储 前端开发 JavaScript
在React中有效地管理组件之间的通信和数据流
在React中有效地管理组件之间的通信和数据流
|
6月前
|
前端开发
React组件通信:如何优雅地实现组件间的数据传递
React组件通信:如何优雅地实现组件间的数据传递
174 0
|
6月前
|
存储 前端开发 中间件
React组件间的通信
React组件间的通信
51 1
|
6月前
|
Rust 前端开发 JavaScript
IM跨平台技术学习(十):快速对比跨平台框架Electron、Flutter、Tauri、React Native等
在本文中,我们将比较五种流行的桌面应用程序开发框架:Electron、Flutter、Tauri、React Native 和 Qt,希望可以帮助你根据项目需求做出明智的技术选型决策。
441 2
|
6月前
|
前端开发
React中兄弟组件通信和组件跨级传递Context的使用
React中兄弟组件通信和组件跨级传递Context的使用
|
6月前
|
JavaScript 前端开发 小程序
Vue、React和小程序中的组件通信:父传子和子传父的应用
Vue、React和小程序中的组件通信:父传子和子传父的应用
81 0
|
前端开发 JavaScript 开发者
react组件通信
前言: React是一种流行的JavaScript库,用于构建现代化的、高性能的Web应用程序。在React中,组件是代码的构建块。组件通信是React中一个非常重要的概念,它使得开发者可以将应用程序拆分成更小、更可维护的部分。本篇博客将介绍React中组件通信的方法,以及如何在不同的场景中使用它们。
30 0