将数据从main传递到renderer(electron-js)



我在摆弄电子。在我的应用程序中,我有一个Javascript对象,其中包含了我应用程序的所有设置。这个对象有一个名为"的键;渲染器";我想传递给渲染的窗口,以便将所有设置保存在一个方便的位置。

我一直在查阅文档,发现最好的方法是如下(除了通过BrowserWindow的附加参数在process.argv中传递变量之外(。

在main.js:中

ipcMain.handle('getSettings', () => {
return settings.renderer
})

preload.js

contextBridge.exposeInMainWorld('bridge', {
getSettings: () => ipcRenderer.invoke('getSettings')
})

render.js

function getSettings() {
settings = window.bridge.getSettings().then(response => {
console.log(response)
})
}
getSettings()

有没有更方便的方法来实现这一点?在这一点上,有可能以同步的方式实现吗

创建并加载窗口后,您可以通过IPC。

  • 使用contents.send(channel,…arg(以向渲染进程发送数据。

  • 使用ipcRenderer.on(通道,侦听器(在preload.js脚本中接收来自主进程的数据。


main.js(主过程(

// Import required electron modules
const electronApp = require('electron').app;
const electronBrowserWindow = require('electron').BrowserWindow;
// Import required Node modules
const nodePath = require('path');
// Prevent garbage collection
let window;
// Settings object
let settings = {
'renderer': {
'key1': 'value1',
'key2': 'value2'
}
}
function createWindow() {
const window = new electronBrowserWindow({
x: 0,
y: 0,
width: 800,
height: 600,
show: false,
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
preload: nodePath.join(__dirname, 'preload.js')
}
});
window.loadFile('index.html')
.then(() => { window.webContents.send('sendSettings', settings.renderer); })
.then(() => { window.show(); });
return window;
}
electronApp.on('ready', () => {
window = createWindow();
});
electronApp.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
electronApp.quit();
}
});
electronApp.on('activate', () => {
if (electronBrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});

preload.js(主过程(

// Import the necessary Electron modules
const contextBridge = require('electron').contextBridge;
const ipcRenderer = require('electron').ipcRenderer;
// Exposed protected methods in the render process
contextBridge.exposeInMainWorld(
// Allowed 'ipcRenderer' methods
'bridge', {
// From main to render
sendSettings: (message) => {
ipcRenderer.on('sendSettings', message);
}
}
);

index.html(渲染过程(

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Electron Test</title>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';"/>
</head>
<body>
<p>See Developer Tools -> Console</p>
</body>
<script>
window.bridge.sendSettings((event, settings) => {
console.log(settings);
});
</script>
</html>

主题是"将数据从主文件传递到渲染器";;而不是相反。而ipcMain对于renderer to main(其中renderer是查询的来源(有很好的文档记录;但反过来,如果您只是想将源自main的数据发送到渲染进程,则可以使用webContents.executeJavaScript将数据发送到渲染过程的窗口。也就是说,从main.js中创建BrowserWindow:

const BrowserWindow = require('electron').BrowserWindow;
let win = new BrowserWindow({ width: 640, height: 480 });
win.webContents.loadFile('index.html');
win.webContents.on('did-finish-load', () => {
win.webContents.executeJavaScript("console.log('hello from main');");
});

继续创建一个新窗口,加载文件index.html,然后主要通过executeJavaScript发送数据。不需要ipcMain也不需要预加载.js。这是单向的,用于处理用户的初始查询。

最新更新