electron 将React + Redux + MUI菜单转换为电子菜单

bxjv4tth  于 2022-12-08  发布在  Electron
关注(0)|答案(1)|浏览(209)

我正在尝试将一个基于网络的React + Redux + MUI应用程序转换为电子应用程序。该应用程序有一个主AppBar,其中有多个下拉菜单,菜单项与应用程序的Redux商店挂钩。因此,这是一个相当典型的设置,为这些技术的合作,但我正在努力理解如何翻译(如果可能的话)到一个电子应用程序菜单。
因此,如果我有一个带有典型onClick处理程序的MUI MenuItem,如下所示:

const [soneState, setSomeState] = useState();

const handleOnClick = (e) => {
  const val = e.target.value;
  console.log(`The value is ${val}`);
  setSomeState(val);
}

Electron Menu的等价物是什么?假设我使用的是Redux存储,而不是本地组件状态。菜单中的许多处理程序通过fetch与Express服务器通信。我一直在阅读通过contextBridge进行的Electron进程间通信。但是我不确定电子菜单在等式中的哪一边。它能同时利用Redux存储和与主进程对话吗?我想我不能从菜单中进行fetch调用吧?

jqjz2hbq

jqjz2hbq1#

好吧我想我明白了...
我可以使用这里的官方文档中描述的模式在我的preload.js中创建一个API,然后应用菜单可以调用它来向渲染进程发送消息。

const { contextBridge, ipcRenderer } = require('electron')

contextBridge.exposeInMainWorld('api', {
  loadSomeFile: (callback) => ipcRenderer.on('load-some-file', callback),
})

然后,我将菜单定义为:

const { app, Menu, MenuItem, dialog, ipcMain } = require('electron');

module.exports = (window) => {
  return Menu.buildFromTemplate([
    {
      label: 'File',
      submenu: [
        {
          label: 'About',
        },
        {
          label: 'Preferences',
        },
        {
          type: 'separator'
        },
        {
          label: 'Load Some File',
          click() {
            dialog.showOpenDialog({
              properties: ['openFile']
            })
            .then((fileObj) => {
              window.webContents.send('load-some-file', fileObj);
            })
          }
        },
        {
          type: 'separator'
        },
        {
          label: 'Exit',
          click() {
            app.quit()
          }
        }
      ]
    },
  ])
}

在我的main.js中,我有:

const { app, BrowserWindow, Menu, } = require('electron');
const path = require("path");
const mainMenu = require("./app/main-menu");

const createWindow = () => {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      nodeIntegration: false,
      contextIsolation: true
    }
  });
  win.loadURL("http://localhost:8080");
  return win;
}

app.whenReady().then(() => {
  const win = createWindow();
  Menu.setApplicationMenu(mainMenu(win));
});

我的React/Redux/MUI前端代码中的大部分内容都可以保持不变,但我需要从前端的window对象访问API,并监听来自Main进程的事件(如来自应用菜单)。

window.api.loadSomeFile((event, data) => {
  console.log(data);
});

测试过了,效果很好。在我的代码中几乎没有什么实际的变化。

相关问题