如何在Electron中将参数从主进程传递到渲染进程

dam*_*ien 6 javascript electron

我有一个可以打开不同窗口的电子应用程序.

在应用程序启动时,应用程序打开一组窗口(加载相同的HTML和JS文件),但使用params更改每个窗口显示的信息.

示例:

app.on('ready', async () => {
  ...
  // open window for stuff 1
  win1 = new BrowserWindow({
     width: 1024,
     height: 728
  });
  win1.loadURL(`file://${__dirname}/app/app.html?id=1`);

  // open window for stuff 2
  win2 = new BrowserWindow({
     width: 1024,
     height: 728
  });
  win2.loadURL(`file://${__dirname}/app/app.html?id=2`);
Run Code Online (Sandbox Code Playgroud)

显然在file:// path中传递params不起作用.我无法在Electron文档或Internet上的其他地方找到明确的解决方案来将我渲染的窗口调整为参数.

我可以在窗口准备好之后使用IPC通信,但它似乎有点太复杂,直到我只想将变量传递给我的子视图.

PS:说实话,我的应用程序是使用React/Redux构建的,我想传递给view的param是用于监听此视图的redux存储键.

Cir*_*les 14

将查询字符串与win.loadFile(),一起使用

// main process or renderer process 1
data = {"age": 12, "healthy": true}

let win = new BrowserWindow({
        webPreferences: {
          nodeIntegration: true
        }
      });

win.loadFile("public/print.html", {query: {"data": JSON.stringify(data)}});
Run Code Online (Sandbox Code Playgroud)
// renderer process 2
const querystring = require('querystring');
let query = querystring.parse(global.location.search);
let data = JSON.parse(query['?data'])
Run Code Online (Sandbox Code Playgroud)


dam*_*ien 12

根据原子源代码,查询字符串方法是一种非常简单的可靠方法,特别是当我们只需要传递一个唯一的字符串参数时:

// main process
win1.loadURL(`file://${__dirname}/app/app.html?id=${id}`);

// rendered process
console.log(global.location.search);
Run Code Online (Sandbox Code Playgroud)

https://github.com/electron/electron/issues/6504


小智 10

几种方法:

loadURL查询字符串

其他人发布的查询字符串方法似乎工作正常。这甚至可能是最简单的。

其他参数

Electron的文档说additionalArguments

对于将少量数据向下传递到渲染器过程预加载脚本很有用。

主要

const win = new BrowserWindow({
  width: 800,
  height: 600,
  backgroundColor: '#000000'
  webPreferences: {
    additionalArguments: ["myvarvalue", "secondvarvalue", "--another=something"]
  }
});
Run Code Online (Sandbox Code Playgroud)

渲染器

window.process.argv 看起来像这样:

["--num-raster-threads=2",
"--enable-gpu-memory-buffer-compositor-resources",
"--enable-gpu-async-worker-context",
...
"--renderer-client-id=4",
"myvarvalue",
"secondvarvalue",
"--another=something"]
Run Code Online (Sandbox Code Playgroud)

它将追加一个字符串数组。您可以做一些事情window.process.argv.slice(-3)来获取数组中的最后一项。


IPC主/渲染

就像您说的那样,您要做的事情似乎很复杂,但这也许会有所帮助:

主要

const { ipcMain } = require('electron');

var mainProcessVars = {
  somevar: "name",
  anothervar: 33
}

ipcMain.on('variable-request', function (event, arg) {
  event.sender.send('variable-reply', [mainProcessVars[arg[0]], mainProcessVars[arg[1]]]);
});
Run Code Online (Sandbox Code Playgroud)

渲染器

const { ipcRenderer } = electron;

electron.ipcRenderer.send('variable-request', ['somevar', 'anothervar']);

ipcRenderer.on('variable-reply', function (event, args) {
  console.log(args[0]); // "name"
  console.log(args[1]); // 33
});
Run Code Online (Sandbox Code Playgroud)

这样,您可以发送字符串以外的数据。