Reactjs 如何从“磁盘”驱动外部网页;“渲染器侧”;电子应用程序?

Reactjs 如何从“磁盘”驱动外部网页;“渲染器侧”;电子应用程序?,reactjs,electron,Reactjs,Electron,我是电子新手,不擅长反应,所以如果这是超碱性的,我会提前道歉。我正在创建一个小的电子桌面应用程序,用户可以在其中键入一些关键字,选择一些选项等,然后一个新窗口生成,并将根据他们选择的内容执行一些操作(例如,解析一些航班选项,并将匹配的航班添加到购物车)。我通过以下操作获得了一个非常基本的版本: Electron在主窗口中加载我的表单和选项 mainWindow = new BrowserWindow({ ... options here ... }) mainWindow.loadURL(sta

我是电子新手,不擅长反应,所以如果这是超碱性的,我会提前道歉。我正在创建一个小的电子桌面应用程序,用户可以在其中键入一些关键字,选择一些选项等,然后一个新窗口生成,并将根据他们选择的内容执行一些操作(例如,解析一些航班选项,并将匹配的航班添加到购物车)。我通过以下操作获得了一个非常基本的版本:

Electron在主窗口中加载我的表单和选项

mainWindow = new BrowserWindow({ ... options here ... })
mainWindow.loadURL(startUrl);
我的react组件中有一个按钮,用于向IPC通道发送信息:

....
  <button id="sendSyncMsgBtn" onClick={handleClick}>Ping Main Process</button>
...
function handleClick(e) {
  e.preventDefault();
  console.log('The button was clicked.');
  ipcRenderer.send(channels.SC_WINDOW, userData);
}
目前看来,这或多或少是可行的,但我一直在博客和教程中阅读“您不应该从主进程控制显示,应该将所需的信息传递到渲染器进程,并在那里执行操作”。我的问题是——假设我的“第二个窗口”正在打开一个我无法控制的外部URL,我如何将它的控制权交给渲染器进程?这可能吗?我可以理解,如果我将第二个窗口重定向到我的另一个React组件,那么我就可以使用该类的
render
组件来监听IPC频道。但是,当我打开一个我实际上并不负责的URL时,我该怎么做呢?或者,我应该在自己的React组件上打开第二个窗口,该组件只返回指向外部URL的重定向,但也可以在其中包含一些附加功能

或者,我应该忽略那些告诉我使用渲染器进程而不是主进程的帖子,因为它们讨论的是渲染您控制的页面吗


这一点让我毛骨悚然——我认为它是如此基本,以至于我似乎无法通过谷歌搜索找到一个好的解释(或者我只是在谷歌搜索错误的关键字),因此,任何建议都将不胜感激。

执行javascript并不是执行多行代码的合适方法。为什么不通过
预加载注入脚本呢?,看起来这是一个自动检查机器人。:)@tpikachu是的,没错,我正试图收集来自各种度假提供商/航空公司等的数据,并打开预订页面,根据用户的选择“预订”航班。如果我使用
预加载
,您能说明代码的外观吗?我已经在使用它来设置
ipcRenderer
,但是它如何帮助我在渲染器端而不是主进程端运行JS签出代码呢?或者我不必担心吗?您可以在这个对象或类中声明一些模块,如
Bot\u函数
,您需要在渲染器上运行侦听器和函数。我相信您正在预加载时向渲染器公开ipcRenderer,如
window.ipcRenderer=ipcRenderer
ipcMain.on(channels.SC_WINDOW, (event) => {
  console.log('Received the event');
  secondWindow = new BrowserWindow({... options here ...});
  secondWindow.loadURL(flightBookerUrl);

  secondWindow.webContents.on('did-finish-load', () => {
    let code;
    
    // log just to make sure it's working
    code = `console.log('The code is executed')`;
    secondWindow.webContents.executeJavaScript(code);

    // click the "add item" button
    code = `
      var xPathRes = document.evaluate ('//*[@id="add-remove-buttons"]/input', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
      xPathRes.singleNodeValue.click();
    `;
    secondWindow.webContents.executeJavaScript(code);

    // click the "checkout now" button
    code = `
      var xPathRes = document.evaluate ('//*[@id="cart"]/a[2]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
      xPathRes.singleNodeValue.click();
    `;
    secondWindow.webContents.executeJavaScript(code);
  });
});