electron創建新窗口模態框並實現主進程傳值給子進程
正文
我們在開發的過程中難免會遇到需要創建一個子窗口(子進程),但是在這個子進程中所有值都是初始化的,而我們肯定是需要一些值才能進行下一步操作,比如:token; 那麼我們怎麼去傳遞值呢?
我先給夥伴們說一些,基本原理(下面很多東西會建立在vue的基礎上生命周期,如果是其他框架就自行修改就行),然後再給大傢根據代碼一步一步操作。
- 首先我們是需要創建一個子進程(或者叫新窗口,模態框都可以)
- 發送一個命令到主進程去創建一個新窗口
- 新窗口創建好以後等頁面渲染完成(mounted/this.$nextTick)
- 然後我們在this.$nextTick中通知子進程頁面已經渲染完成,
- 子進程接收到消息以後,通知主進程的渲染進程
- 主進程的渲染進程接收到消息以後,攜帶值發送給主進程,然後發送給子進程的渲染進程
- 到這兒就完成瞭
大傢看到這兒可能覺得很麻煩,但是如果我們在創建新窗口的時候就傳遞值的話,可能子進程的渲染進程拿不到值;主要原因有:
- 可能子進程還沒創建成功,但是值就已經過來瞭,這個時候你去發送請求啊什麼的,就會失敗!
- 還有就是可能會出現在創建窗口的時候比較卡頓,你的值過去瞭,創建還是白面等等
所以我們當時搞瞭這種方法,目前運行半年以上基本上都沒得問題;如果你有更好的方法也可以告訴我們,一起聊聊;哈哈哈
創建新窗口
主進程
在主進程中配置窗口信息,具體內容可以看文檔,以下是我的配置;配置中的參數都是可以根據自己的需求變化的;
註意: 在開發環境時,root_path的地址必須是你的ip地址,而不是localhost一類的。
let modal; // 接收彈出模態框 ipcMain.on('open-modal',(event,path,title = '提示')=>{ console.log(path); let root_path; if (process.env.WEBPACK_DEV_SERVER_URL) { root_path = "http://192.168.110.95:8080/"; // root_path = "http://192.168.124.4:8080/"; } else { // root_path = "app://./index.html/"; root_path = `file://${__dirname}/index.html/`; }; const minWidth = 1176; const minHeight = 600; const width = 1200; const height = 700; modal = new BrowserWindow({ parent: BrowserWindow.getFocusedWindow() || undefined, modal: true, // frame: false, width: width, height: height, minWidth: minWidth, minHeight: minHeight, // autoHideMenuBar: true, // 是否顯示菜單欄 // backgroundColor:'#000', // 背景 hasShadow: true, // 陰影 resizable: true, // 窗口是否可以放大 webPreferences: { webviewTag: true, contextIsolation: false, nodeIntegration: true, enableRemoteModule: true, webSecurity: false, }, }); modal.loadURL(root_path + "#/" + path); });
創建一個路由
{ path:'/modal', name:'modal', component:() => import('@/views/db-file/text.vue'), },
試試能不能啟動
在渲染進程中發送命令,參數需要和路由path一致即可打開窗口
ipcRenderer.send('open-modal','modal')
啟動新窗口
當我們做到這的時候,我們的新窗口基本上就算是可以打開瞭;打開瞭以後呢!我們需要向他傳遞一些值,這個時候為瞭方便區分;如下:
主程序
渲染進程:A渲染進程 主進程:A主進程
子程序(模態框) 渲染進程:B渲染進程 主進程:B主進程
傳值
在B渲染進程渲染完成以後(vue中的話是nextTick),發送命令通知B主進程
ipcRenderer.send('modal-accomplish')
當在B主進程中接收到消息以後,發送給A渲染進程;
// 通知模態框渲染完成 ipcMain.on('modal-accomplish',(event,msg)=>{ // 發送給渲染進程 win.webContents.send("modal-accomplish-state"); })
在A渲染進程中接收
onMounted(()=>{ ipcRenderer.on('modal-accomplish-state',()=>{ console.log('偉大時代'); }) })
A渲染進程接收到值以後在發送給A主進程
onMounted(()=>{ ipcRenderer.on('modal-accomplish-state',()=>{ console.log('偉大時代'); ipcRenderer.send('modal-accomplish-end','傳值'); }) })
A主進程接收到值以後發送給B渲染進程
ipcMain.on('modal-accomplish-end',(event,token)=>{ modal.webContents.send('modal-accomplish-child-end',token); })
B渲染進程接收值
ipcRenderer.on('modal-accomplish-child-end',(event,msg)=>{ console.log(msg); // 傳值 })
以上五/六步就可以將值獲取到瞭;你學會瞭嗎?
以上看起來可以能些許復雜,你多練習兩次就覺得還好瞭!這也是為瞭避免一些問題想出來的;大傢可以參考;有更好的方法也可以留言討論
註意 如果你在寫瞭代碼以後沒有接收到值的話,可以重啟一下;可能是你寫瞭主進程代碼更新不及時導致的
以上就是electron創建新窗口模態框並實現主進程傳值給子進程的詳細內容,更多關於electron模態框主進程傳值子進程的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Electron進程間通信的實現
- vue + electron應用文件讀寫操作
- Electron應用顯示隱藏時展示動畫效果實例
- 微信小程序自定義modal彈窗組件的方法詳解
- 如何使用Vue3設計實現一個Model組件淺析