reactjs - İkinci pencerem neden Electron'da ipcRenderer'a erişemiyor
Bir Electron React TypeScript uygulaması oluşturuyorum ve electron contextBridge ile ilgili bir sorunla karşılaştım
İki pencerem var, her birinin kendi sayfası var. OverviewPage (ve ana pencerede) preload dosyasında contextBridge.exposeInMainWorld aracılığıyla açığa çıkarılan işlevlere erişmekte sorun yaşamıyorum. Ancak, aynı API çağrılarına SelfReport sayfasında erişmeye çalışırsam, aşağıdaki hatayı alıyorum
Yakalanmamış TypeError: Tanımsız olanın özellikleri okunamıyor ('closePopup' okunuyor)
Benim preload.ts dosyam
const { ipcRenderer, contextBridge } = require("electron");
contextBridge.exposeInMainWorld("api", {
closePopup: (args: any) => ipcRenderer.send("close-popup", args)
// other calls
});
export {};
Main.ts Ana Pencere
function createWindow(width: any, height: any) {
const mainWindow = new BrowserWindow({
width: width,
height: height,
fullscreen: true,
webPreferences: {
contextIsolation: true,
preload: path.join(__dirname, "/preload.js"),
},
});
if (app.isPackaged) {
mainWindow.loadFile(path.join(__dirname, "../index.html"));
} else {
mainWindow.loadURL("http://localhost:3000");
}
Main.ts İkinci Pencere
let popupWindow;
function createPopupWindow(width: any, height: any) {
popupWindow = new BrowserWindow({
frame: false,
resizable: false,
movable: false,
focusable: false,
alwaysOnTop: true,
skipTaskbar: true,
height: 300,
width: 400,
x: width - 400,
y: height - 300,
webPreferences: {
webPreferences: {
contextIsolation: true,
//preload: path.join(__dirname, "/preload.js"), Do I need this?
},
},
});
Menu.setApplicationMenu(null);
popupWindow.loadURL("http://localhost:3000/report");
}
React'te
window.api.closePopup({ close: true });
ve
class App extends Component {
componentDidMount() {}
render() {
return (
<BrowserRouter>
<Switch>
<Route element={<WithNavbar />}>
<Route path="/" element={<OverviewPage />} />
</Route>
<Route element={<WithoutNavbar />}>
<Route path="/report" element={<SelfReport />} />
</Route>
</Switch>
</BrowserRouter>
);
}
}
react-app-env.d.ts içinde
/// <reference types="react-scripts" />
declare global {
interface Window {
api: any;
}
}
export {};
Not
- Uygulamamı başlatırken, oluşturulmuş
preload.jssürümünü kullanıyorum. - Tüm React Sayfaları
Fonksiyon Bileşenleridir
Cevap #1
Senin Main.ts dosyan (ikinci pencere) fazladan bir webPreferences seviyesine sahip. Bu ekstra seviye kaldırılabilir.
Ayrıca, window.api.closePopup çağrınızın çalışması için preload: satırınızın yorumunu kaldırmalısınız.
Main.ts (ikinci pencere)
let popupWindow;
function createPopupWindow(width: any, height: any) {
popupWindow = new BrowserWindow({
frame: false,
resizable: false,
movable: false,
focusable: false,
alwaysOnTop: true,
skipTaskbar: true,
height: 300,
width: 400,
x: width - 400,
y: height - 300,
webPreferences: {
contextIsolation: true,
preload: path.join(__dirname, "/preload.js") // Do I need this? Yes
}
});
Menu.setApplicationMenu(null);
popupWindow.loadURL("http://localhost:3000/report");
}
