【问题标题】:How to switch from remote to ipcMain and ipcRenderer?如何从远程切换到 ipcMain 和 ipcRenderer?
【发布时间】:2021-05-06 14:01:59
【问题描述】:

我正在使用 react 制作电子应用程序,并且我使用远程模块完成了标题栏控件,但在控制台中我收到警告,remote 模块已被弃用。我想更改我的代码以使用 ipcMainipcRenderer 而不是远程但我无法让它工作。

这是我的代码,可以 100% atm 工作,但使用远程模块。有人可以展示至少一个功能,例如app.minimize() 如何使用ipcMainipcRenderer

import { useState, useEffect } from "react";
import { remote } from "electron";
import {
  VscChromeMinimize,
  VscChromeMaximize,
  VscChromeRestore,
  VscChromeClose,
} from "react-icons/vsc";

const TitlebarControls = ({ minimize, maximize, close }) => {
  const app = remote.getCurrentWindow();
  const [maximizeIcon, setMaximizeIcon] = useState(
    app.isMaximized() ? <VscChromeRestore /> : <VscChromeMaximize />
  );

  useEffect(() => {
    app.on("maximize", () => setMaximizeIcon(<VscChromeRestore />));
    app.on("unmaximize", () => setMaximizeIcon(<VscChromeMaximize />));
  }, [app]);

  return (
    <ul className="titlebar-controls">
      {minimize && (
        <li className="minimize" onClick={() => app.minimize()}>
          <VscChromeMinimize />
        </li>
      )}
      {maximize && (
        <li
          className="maximize"
          onClick={() =>
            !app.isMaximized() ? app.maximize() : app.unmaximize()
          }
        >
          {maximizeIcon}
        </li>
      )}
      {close && (
        <li className="close" onClick={() => app.close()}>
          <VscChromeClose />
        </li>
      )}
    </ul>
  );
};

export default TitlebarControls;

【问题讨论】:

    标签: javascript reactjs electron


    【解决方案1】:

    remote 模块将在 Electron 14 中删除,但如果您只关心弃用,则可以使用 @electron/remote 模块。 docs 给出如下使用方式:

    // Deprecated way
    // const { BrowserWindow } = require('electron').remote
    // Replace with:
    const { BrowserWindow } = require('@electron/remote')
    
    // In the main process:
    require('@electron/remote/main').initialize()
    

    如果您希望 ipc 方法实现相同,请执行以下操作:

    在 renderer.js 中:

    const { ipcRenderer } = require('electron')
    //to minimize
    ipcRenderer.send('minimize', data);//data contains any extra info you may need to send
    

    在 main.js 中:

    const { ipcMain, app } = require('electron')
    ipcMain.on('minimize', (event, data) => {
        //Minimize logic
    })
    

    【讨论】:

    • 这将不起作用,除非在初始化窗口时将contextIsolation 设置为false 并且nodeIntegration 设置为true,因为它们的默认值在电子12.0.0 中已更改。还建议使用带有contextBridge 的预加载脚本,因为这样可以提高安全性:stackoverflow.com/a/63894861/13752696
    • 在我的情况下是renderer.js我的TitlebarControls.js文件和main.js我的App.js在React的src文件夹中?因为我试过了,但没有奏效。我将我的contextIsolation 设置为falsenodeIntegration 设置为true,因为没有它我的遥控器无法工作。
    • @Foxeread 是正确的,因为它确实对安全性有影响,但是这个解决方案对你有用吗@Klak031?
    • @akshayks 不是真的,但可能是因为我不确定 renderer.jsmain.js 指的是什么。是main.js我的App.js文件来自react还是我的main.js文件来自电子,renderer.js是什么@
    • @Klak031 renderer.js 通常指您处理 dom 事件的文件。您要从中发送 ipc 事件的任何文件都足够了。但它通常是您前端的一部分。 main.js 将是您为应用程序初始化窗口的文件。您也可以将其放在任何其他文件中,但为简单起见,您可以将其放在那里。
    猜你喜欢
    • 2016-08-01
    • 1970-01-01
    • 2021-11-02
    • 2018-05-15
    • 2021-11-29
    • 2018-10-03
    • 2021-08-01
    • 2021-07-22
    • 2018-12-29
    相关资源
    最近更新 更多