【发布时间】:2021-10-26 14:55:57
【问题描述】:
我将 Electron 13 与 React 17 一起使用。我已将 nodeIntegration 设置为 false 并将 contextIsolation 设置为 true,因此我使用 preload.js 文件来公开 API 以在主进程和渲染器进程之间进行通信。
我必须使用这个 API 在 React 组件中监听 IPC 消息。但是,每次我的组件被挂载(或重新渲染)时,Electron 都会创建一个新的 IPC 事件侦听器,从而导致内存泄漏。
preload.js
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('api', {
send: (channel, data) => {
// Whitelist channels
let validChannels = ['toMain'];
if (validChannels.includes(channel)) {
ipcRenderer.send(channel, data);
}
},
receive: (channel, func) => {
let validChannels = ['fromMain'];
if (validChannels.includes(channel)) {
// Deliberately strip event as it includes `sender`
ipcRenderer.on(channel, (event, ...args) => func(...args));
}
}
});
ReactComponent.js
import { useEffect, useRef } from 'react';
const ReactComponent = () => {
const _isMounted = useRef(true);
const exampleFunction = () => {
window.api.send('toMain');
};
window.api.receive('fromMain', function (data) {
if (_isMounted.current) {
// Process `data`...
}
});
useEffect(() => {
exampleFunction();
// Another IPC call
window.api.send('toMain', ['example']);
window.api.receive('fromMain', function (data) {
// Process `data`...
});
return () => {
_isMounted.current = false;
// Somehow I should remove the IPC event listeners here,
// but I don't know how, since (I think) they are created
// in the `preload.js` file...
};
}, []);
return (
// JSX
);
};
export default ReactComponent;
如何取消注册通过window.api.receive() 创建的事件监听器?
【问题讨论】:
标签: reactjs events electron ipc