簡體   English   中英

Electronjs ipcRenderer.on 無法正常工作

[英]Electronjs ipcRenderer.on not working properly

我正在嘗試將數據從主進程發送到渲染器並且正在執行 ipcRenderer.on function 但數據未定義......

這是發送數據的代碼:

mainWindow.webContents.on("did-finish-load", () => {
        let name = "test";
        mainWindow.webContents.send("updateSave", name);
})

這是接收它:

ipcRenderer.on("updateSave", (e, data) => {
    console.log("data: " + data);
})

console.log 正在被解雇,但它只是說:數據:未定義

這是預加載文件:

contextBridge.exposeInMainWorld("ipcRenderer", {
    send: (channel, ...args) => ipcRenderer.send(channel, ...args),
    on: (channel, func) => ipcRenderer.on(channel, (event, ...args) => func(...args))    
});

有人知道我做錯了什么嗎? 謝謝

在您的preload.js中,您定義ipcRenderer.on()如下:

on: (channel, func) => {
    ipcRenderer.on(
        channel,
        (event, ...args) => {
            func(...args)
        }
    )
}

因此, event永遠不會傳遞給func()並因此被吞噬。 現在,有兩種可能的解決方案(就個人而言,我將 go 與 (1) 結合使用,因為它最容易實現,並且會使兩部分的代碼更清晰。但是,請參閱下面的評論):

(1) 您想在渲染器中保留簽名
也就是說,你仍然想寫ipcRenderer.on("channel", (event, data) => {}); . 然后你將不得不改變你的預加載代碼。 我建議像這樣簡單地將func傳遞給 ipcRenderer:

on: (channel, func) => ipcRenderer.on (channel, func)

然后,任何func參數都必須具有簽名(event, ...data) => {}

(2) 您想在預加載中保留簽名
即,您想保留預加載contextBridge定義的代碼。 然后,渲染器代碼中的任何ipcRenderer.on()實例都需要更改以適應簽名(...data) => {} ,因為沒有event參數傳遞給 function。


作為旁注,如果在使用預加載腳本進行代理時將 Electron API function(例如ipcRenderer.on()ipcRenderer.send()等)暴露給渲染器,而是提供離散的,這被認為是最佳實踐供您的渲染器代碼選擇的功能,如Electron 的官方 IPC 教程所示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM