我是电子公司的新手,还在熟悉IPC的通讯。我能够通过IPC发送和接收消息(这意味着我可以在两个方向上确认send和receive语句正在触发)。当我从renderer向main发送一个值时,这个值完全可以正常打印出来。我不明白的是,为什么当我试图从main向renderer发送一个值时,无论该值是什么,它总是以“未定义”的形式出现。send和receive语句仍在触发,只是值不能正确显示。
这里我从renderer发送到main:
const dataSend = "Test Data"
ipcRenderer.send('tester:send', {
dataSend
});
字符串
在main中,我接收信号,(成功地)打印出与它一起发送的数据,然后通过新信号将新值发送回渲染器:
ipcMain.on('tester:send', (e, options) => {
console.log(options.dataSend);
const newData = "The Final Data";
mainWindow.webContents.send('tester:toRender', {
newData
});
});
型
它在渲染器中接收到:
ipcRenderer.on('tester:toRender', (e, options) => {
console.log("YUP IT ARRIVED");
console.log(options.newData);
})
型
console.log仍然可以正常触发,但无论数据类型或值是什么,它总是会显示为undefined。我被卡住了,我不明白,任何帮助都会很棒。
我只是想一种方法来发送一个消息从渲染器到主访问一些数据,包的数据在主和发送回渲染器使用可见的html元素。我不明白为什么我可以很好地将消息从main发送到renderer,并且接收代码将执行,但数据在此过程中丢失了。
编辑:这是我的preload.js:
//NOTES:
// The preload function is mainly used for exposing nodes to the renderer
// to be used outside the scope of this file
const fs = require('fs');
const os = require('os');
const path = require('path');
const Toastify = require('toastify-js');
const { contextBridge, ipcRenderer} = require('electron');
//Allows use of functions from nods to be used inside main and render
contextBridge.exposeInMainWorld('os', {
homedir: () => os.homedir()
});
contextBridge.exposeInMainWorld('path', {
join: (...args) => path.join(...args)
});
contextBridge.exposeInMainWorld('Toastify', {
toast: (options) => Toastify(options).showToast(),
});
contextBridge.exposeInMainWorld('ipcRenderer', {
send: (channel, data) => ipcRenderer.send(channel, data),
on: (channel, func) => ipcRenderer.on(channel, (event, ...args) => func(...args)),
});
型
2条答案
按热度按时间enyaitl31#
尝试将
window.ipcRenderer = require('electron').ipcRenderer
添加到预加载文件。ipcRenderer
在渲染器中是如何定义的?dw1jzc5e2#
我认为问题在于你如何重新定义
ipcRenderer.on
,当你运行func
回调函数时,你传入...args
来代替事件。看看这个更新的代码:字符串