後續可能會用electron開發一些工具,包括不限于快速生成個人小程式、開發輔助學習的互動式軟體、幫助運維同學一鍵部署的簡易版CICD工具等等。
開發進度,取決于我懶惰的程度。
不過不嫌棄的同學還是可以先關注一波小程式——中二少年工具箱,真的釋出工具了,肯定還是需要一個統一下載下傳入口的,各個部落格平台有點不太合适。
前言
有位同學問到一個問題,大緻意思就是他建立了子視窗,但是子視窗的右鍵菜單沒有生效,如圖:
他的代碼大緻看了下,雖然沒找到
webContents.on('context-menu', (e, params) => {
contextMenu.popup()
})
但是代碼裡有contextMenu.popup(),應該是在某個地方做了監聽吧。
因為沒有完整代碼,我沒辦法明确告訴同學具體哪裡做錯了,但我可以把正确寫法釋出出來,免得一直在評論區長篇對話。
一、右鍵菜單建立
右鍵菜單的建立大緻分為這麼幾步:
- 建立一個視窗,這是放右鍵菜單的容器:
let win=new BrowserWindow(options)
BrowserWindow是electron提供的對象,可自行查閱。
- 建立右鍵菜單:
// 建立右鍵菜單
let contextMenu = Menu.buildFromTemplate([
{label: 'Item 1' || test,role:'reload'},
{role: 'editMenu'}
])
Menu同樣是electron提供的對象。
- 把第二步建立的菜單放到第一步建立的視窗:
win.webContents.on('context-menu', (e, params) => {
contextMenu.popup()
})
webContents是BrowserWindow的一個屬性,執行個體化後可以調用。
二、為子視窗建立右鍵菜單
通過上面章節,大家了解了如何建立右鍵菜單,我們會發現一個規律,那就是我們為某個視窗挂載了對應的右鍵菜單,這是對應關系。
那麼如果建立子視窗,如何為子視窗建立右鍵菜單呢?
其實很簡單,就是重複一遍上面的操作。
我自己demo裡面封裝解耦有點多,如果不通讀項目,可能會增加了解成本,是以這裡就參考主視窗菜單實作,複制粘貼實作子視窗菜單了,這種屎山代碼前身,希望不要影響看到的同學。
對應上面章節的步驟:
- 建立一個主視窗,然後再建立一個子視窗:
let win=new BrowserWindow(options)
let child = new BrowserWindow({ parent: this.win , modal: true,})
child.loadURL('https://baidu.com')
2. 建立主視窗右鍵菜單,我又複制實作子視窗右鍵菜單:
// 建立主視窗右鍵菜單
let contextMenu = Menu.buildFromTemplate([
{label: 'Item 1' || test,role:'reload'},
{role: 'editMenu'}
])
// 建立子視窗右鍵菜單
let contextMenuTest = Menu.buildFromTemplate([
{label: 'Item 2' || test,role:'reload'},
{role: 'editMenu'}
])
3. 把第二步建立的菜單放到第一步建立的視窗:
win.webContents.on('context-menu', (e, params) => {
contextMenu.popup()
})
child.webContents.on('context-menu', (e, params) => {
contextMenuTest.popup()
})
注意:不要直接抄代碼,重點看思路。因為這就是屎山代碼,我在自己demo裡試驗通過後,會對某些封裝過的方法複制粘貼,會修改變量名,萬一哪多個空格,少個變量,别罵我。
最終效果:
2.一點小問題
因為這個視窗是主視窗的子視窗,是以這裡直接寫主視窗的show方法就可以,子視窗會自動顯示。
//等待dom渲染後打開視窗
this.win.on('ready-to-show', () => {
this.win.show()
})
如果哪天你的需求變得很複雜,可能會有各種層級,需要在很多地方控制不同視窗的show,那麼記得做好視窗是否存在的判斷,例如:
this.win.on('ready-to-show', () => {
this.win.show()
console.log('ccccccccccccccc',child)
if(!child.isDestroyed()){
child.show()
}
})
child關閉後,對象不是null,是以必須通過它的isDestroyed方法判斷。
總結
大家有什麼問題也可以私信部落客,沒人問都懶得寫文章了。