我们如何在Electron中从主进程向渲染器进程发送消息

w8f9ii69  于 2022-12-08  发布在  Electron
关注(0)|答案(5)|浏览(335)

我第一次玩电子游戏。试着创建一个文本编辑器
在渲染中,我向发送一条消息,指出内容已更改,需要保存:

document.getElementById('content').onkeyup = e => {
  ipcRenderer.send('SAVE_NEEDED', {
    content: e.target.innerHTML,
    fileDir
  })
}

然后ipcMain接收它没有问题。在菜单上我有这个:

{
  label: 'Save',
  click: _ => {
     saveFile(message)
     // trying:
     // ipcMain.send('SAVED', 'File Saved')
     },
     accelerator: 'cmd+S', // shortcut
}

这样用户就知道文件已经保存了。但这似乎不起作用。有没有其他方法可以做到这一点?我认为“保存”应该是一个预先创建的角色(某种程度上)

xdyibdwo

xdyibdwo1#

若要将消息发送回渲染器,请用途:

win.webContents.send('asynchronous-message', {'SAVED': 'File Saved'});

并这样接收它:

ipcRenderer.on('asynchronous-message', function (evt, message) {
    console.log(message); // Returns: {'SAVED': 'File Saved'}
});

其中asynchronous-message就是你要发送的频道,它可以是任何东西。
webContents.send文档

f8rj6qna

f8rj6qna2#

或者-当你想响应从渲染器进程接收的事件时,你可以这样做:

ipcMain.on("eventFromRenderer", (event) => {
          event.sender.send("eventFromMain", someReply);
     }

来源:https://electronjs.org/docs/api/ipc-main

n9vozmp4

n9vozmp43#

下面是我修改的内容(使用处理contextBridge的新方法),我的用途只是让menuItem在我的React代码中调用导航事件:
第一个

iyr7buue

iyr7buue4#

老问题我却找到了新的好办法;

// on main process index.js
ipcMain.on('event-name', (event, data) => {
    const value = 'return value';
    event.reply(data.waitingEventName, value);
});

// on render frame index.html
const send =(callback)=>{
    const waitingEventName = 'event-name-reply';
    ipcRenderer.once(waitingEventName, (event, data) => {
        callback(data);
    });
    ipcRenderer.send('event-name', {waitingEventName});
};
send((value)=>{
    console.log(value);
});
lndjwyie

lndjwyie5#

来自@raksa的回答
您可以将请求发送到main并获得响应,而不是发送可能无法传递的响应。
使用此示例

//render process
ipcRenderer.send('hello', ['one', 'two', 'three']);

ipcRenderer.once('nice', (e, data) => {
  console.log(data); //['one','two','three']
}) 

//main process
  ipcMain.on('hello', (e, data) => {
    e.reply('nice', data)
  })

相关问题