双向通信
- 方式一:就是把上一篇的两种方式进行结合。
- 例子:点击按钮,向主进程发起进攻,主进程接收到信息之后,给予反馈。
index.html文件
<body>
<button id='btn'>双向通讯</button>
</body>
<script src='renderer.js'></script>
渲染进程 renderer.js文件
window.addEventListener('DOMContentLoaded', () => {
const el = doucment.getElementById( 'btn' );
el.addEventlistener( 'click', () => {
window.api.jingong( );
})
})
预加载文件 preload.js
const { ContentBridge, ipcRenderer } = require( 'electron' );
ContentBridge.exposeInMainWorld( 'api', {
jingong: () => {
ipcRenderer.send( 'saveFile' );
}
})
ipcRenderer.on( 'message', (event, arg) => {
console.log( arg );
} )
主进程文件 main.js
const { BrowerWindow, app} = require( 'electron' );
function createWindow(){
const mainWindow = new BrowserWindow({
window: 500,
height: 500,
webPreferences:{
preload: path.resolve(__dirname, 'preload.js'),
}
});
mainWindow.loadFile( path.resolve(__dirname, 'index.html') )
}
app.whenReady().then(() => {
createWindow();
})
ipcMain.on('saveFile', (event) => {
BrowserWindow.fromWebContents( event.sender ).send('message', '已经收到保存文件指令!!!')
})
- 方式二:预加载脚本中使用ipcRender.invoke('事件')向主进程发起任务通知,主进程通过ipcMain.handle()监听,进行逻辑处理
index.html文件
<body>
<button id='btn'>上传文件</button>
</body>
<script src='renderer.js'></script>
渲染进程 renderer.js
window.addEventlistener('DOMContentLoaded', ()=>{
const btn = document.getElementById( 'btn');
btn.addEventlistener('click', () => {
window.api.upload( (imgUrl) =>{
const img = document.createElement( 'img' );
imr.src = imgUrl;
} )
})
})
预加载脚本 preload.js
const { ContentBridge, } = require('electron');
ContentBridge.exposeInMainWorld('api', {
upload: async (callback) => {
const imgUrl = ipcRenderer.invoke('uploadImg');
callback(imgUrl);
}
})
主进程 main.js
const { dialog, ipcMain } = require('electron');
ipcMain.handle('uploadImg', async () => {
const obj = dialog.showOpenFile();
return obj.filePaths[0];
})