使用:电子v15.2.0使用 https://github.com/electron/electron-quick-start
我知道这是一个很简单的问题,但我似乎找不到解决办法。这是密码。
main.js:
// Get Tasks
ipcMain.on('json:get', (event, dataset) => {
// Read the JSON file
fs.readFile('./data/data.json', 'utf8', (err, jsonString) => {
// Throw error to console if there is one
if (err) {
console.log("File read failed:", err)
return
}
console.log(`JSON Data: ${jsonString}`)
// Send returned JSON data to mainWindow
mainWindow.webContents.send('tasks.return', jsonString)
})
})
preload.js:
const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('ipcRenderer', ipcRenderer)
renderer.js
document.getElementById('test').addEventListener('click', () => {
ipcRenderer.send('json:get', 'tasks')
})
ipcRenderer.on('tasks.return', (event, json) => {
console.log(json)
})
所发生的是事件侦听器正确地触发,我知道,因为JSON将从main.js
代码转储到控制台,但它不是从renderer.js
代码触发的。我得到了错误:Uncaught TypeError: ipcRenderer.on is not a function
,但是它被调用了:
ipcRenderer.on('tasks.return', (event, json) => {
console.log(json)
})
但是,没有使用事件侦听器激发调用它。
我试着补充:
const electron = require('electron')
const { ipcRenderer } = electron
对于renderer.js
,但是我得到了一个错误:Uncaught SyntaxError: Identifier 'ipcRenderer' has already been declared
,但两者都不起作用。
我知道我需要缩短contextBridge和ipcRenderer在preload.js
文件中的范围,我会的,但问题是我无法让电子应用程序将消息发送回mainWindow。
提前感谢!
发布于 2021-10-26 17:00:34
我相信你看到本期了。在启用上下文隔离的情况下,ipcRenderer
没有on
方法?渲染器。
解决方案是将ipcRenderer.on
逻辑移动到预加载脚本中,如下所示(完整的代码示例这里):
contextBridge.exposeInMainWorld("api", {
onResponse: (fn) => {
ipcRenderer.on("tasks.return", (event, ...args) => fn(...args));
}
});
然后你的渲染器可以:
window.api.onResponse((json) => console.log(json));
(请记住提到这里解决方案的内存泄漏)
https://stackoverflow.com/questions/69718631
复制相似问题