【Electron Playground 系列】菜單篇

作者:梁棒棒

1.簡介

菜單主要分為應(yīng)用程序菜單、上下文菜單婿崭,在tray和dock中也有用到菜單,本節(jié)主要介紹前兩種。文檔地址

1.1 應(yīng)用程序菜單

mac和windows都在左上角鳄梅,但是一個在屏幕左上角一個在應(yīng)用程序視圖左上角厕怜。
mac是這樣的:

mac-menu.png

windows長這樣:

win-menu.png

如果windows下沒有顯示菜單衩匣,在當(dāng)前窗口按alt鍵即會出現(xiàn)。

1.2 上下文菜單

即右鍵菜單粥航。

2. 創(chuàng)建菜單

2.1 創(chuàng)建應(yīng)用程序菜單

接下來我們創(chuàng)建應(yīng)用程序菜單琅捏。如下步驟:

  1. 引入Menu類
  2. 定義一個菜單模板
  3. 調(diào)用Menu類的buildFromTemplate方法,該方法會根據(jù)傳入的模板創(chuàng)建對應(yīng)的菜單
  4. 調(diào)用Menu類的setApplicationMenu方法

此四步即可創(chuàng)建應(yīng)用程序菜單递雀,先來看下效果圖柄延。

create-menu.gif

附上代碼:

// 步驟一
const { Menu, dialog, app } = require('electron')

// 步驟二
const template = [
  {
    label: 'app', // macOS下第一個標簽是應(yīng)用程序名字,此處設(shè)置無效
    submenu: [
      { label: '退出', click: () => { app.quit() } },
      { label: '關(guān)于', click: () => { app.showAboutPanel() } }
    ]
  },
  {
    label: '文件',
    submenu: [
      {
        label: '子菜單', 
        click: () => {
          // 調(diào)用了dialog(彈窗模塊)缀程,演示效果
          dialog.showMessageBoxSync({
            type: 'info',
            title: '提示',
            message: '點擊了子菜單'
          })
        }
      }
    ]
  }
]

// 步驟三
const menu = Menu.buildFromTemplate(template)

// 步驟四
Menu.setApplicationMenu(menu)

2.2 創(chuàng)建上下文菜單

即創(chuàng)建右鍵點擊菜單搜吧,前三步與創(chuàng)建應(yīng)用程序菜單相同,最后一步需監(jiān)聽窗口context-menu事件展示菜單選項杨凑。
監(jiān)聽事件context-menu文檔

先上效果圖滤奈。

create-context-menu.gif

附上代碼:

// 步驟一
const { Menu, BrowserWindow } = require('electron')

// 步驟二
const template = [
  {
    label: 'app', // macOS下第一個標簽是應(yīng)用程序名字,此處設(shè)置無效
    submenu: [
      { role: 'quit' },
      { role: 'about' }
    ]
  },
  {
    label: '編輯',
    role: 'editMenu'
  }
]

// 步驟三
const contextMenu = Menu.buildFromTemplate(template)

// 步驟四
// 主進程撩满,渲染進程可使用window.addEventListener設(shè)置監(jiān)聽事件
BrowserWindow.getFocusedWindow().webContents.on('context-menu', () => {
  contextMenu.popup()
})

可能你已經(jīng)發(fā)現(xiàn)蜒程,這個例子的代碼比上個例子少,實現(xiàn)的菜單卻更多鹦牛,而且這個role又是干嘛的呢搞糕,別急,往下看曼追。

3. 設(shè)置菜單屬性

上節(jié)說到窍仰,這個role是干嘛的呢?
其實創(chuàng)建菜單行為有兩種方式礼殊,一種是自定義驹吮,即1.1中實現(xiàn)方式针史,另外一種是預(yù)定義即role

role是MenuItem的屬性碟狞,是electron的預(yù)定義行為啄枕。文檔說:最好給任何一個菜單指定 role去匹配一個標準角色, 而不是嘗試在 click 函數(shù)中手動實現(xiàn)該行為。 內(nèi)置的 role 行為將提供最佳的原生體驗族沃。使用 role 時, label 和 accelerator 值是可選的, 并為每個平臺频祝,默認為適當(dāng)值。

這就是說脆淹,你只要設(shè)置好role屬性常空,那么這個菜單的文案、快捷鍵盖溺、事件行為都已內(nèi)部實現(xiàn)漓糙,而且比自定義的行為體驗更好。

const { Menu, BrowserWindow } = require('electron')

const templateCustom = [
  {
    label: 'app', // macOS下第一個標簽是應(yīng)用程序名字烘嘱,此處設(shè)置無效
    submenu: [
      { label: 'quit', role: 'quit' },
      {label: '關(guān)于', role: 'about', accelerator: 'CommandOrControl + shift + H' }
    ]
  },
  {
    label: '編輯',
    submenu: [
      {role: 'editMenu'},
      {type: 'separator'},
      {label: '自定義', click: () => {
        const win = new BrowserWindow()
        win.loadURL('https://electronjs.org')
      } }
    ]
  }
]

const customMenu = Menu.buildFromTemplate(templateCustom)

Menu.setApplicationMenu(customMenu)

上述代碼line8的accelerator是設(shè)置快捷鍵的屬性昆禽。

4. 隱藏菜單

如果我們在開發(fā)中使用了一些菜單,但是不想讓用戶看到蝇庭,還要在線上保留這個功能醉鳖,比如調(diào)試窗口,方便線上查找bug遗契,那么這個隱藏菜單的屬性visible就可以派上用場了辐棒。

看下效果圖:

hide-menu.gif
const { Menu } = require('electron')
const menu = Menu.getApplicationMenu()

// 獲取要隱藏的菜單將其屬性visible設(shè)置為false
menu.items[3].submenu.items[2].visible = false;

如圖所示:剛開始可以看到view的子菜單Toggle Developer Tools切換調(diào)試窗口,點擊執(zhí)行隱藏該菜單牍蜂,這時通過快捷鍵cmd+option+I(windows下ctrl+shift+I)切換調(diào)試窗口漾根。

我們是曉黑板前端,歡迎關(guān)注我們的知乎鲫竞、Segmentfault辐怕、CSDN簡書从绘、開源中國寄疏、博客園賬號。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末僵井,一起剝皮案震驚了整個濱河市陕截,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌批什,老刑警劉巖农曲,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡乳规,警方通過查閱死者的電腦和手機形葬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暮的,“玉大人笙以,你說我怎么就攤上這事《潮纾” “怎么了猖腕?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長微猖。 經(jīng)常有香客問我谈息,道長,這世上最難降的妖魔是什么凛剥? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮轻姿,結(jié)果婚禮上犁珠,老公的妹妹穿的比我還像新娘。我一直安慰自己互亮,他們只是感情好犁享,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著豹休,像睡著了一般炊昆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上威根,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天凤巨,我揣著相機與錄音,去河邊找鬼洛搀。 笑死敢茁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的留美。 我是一名探鬼主播彰檬,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谎砾!你這毒婦竟也來了逢倍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤景图,失蹤者是張志新(化名)和其女友劉穎较雕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體症歇,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡郎笆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年谭梗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宛蚓。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡激捏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凄吏,到底是詐尸還是另有隱情远舅,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布痕钢,位于F島的核電站图柏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏任连。R本人自食惡果不足惜蚤吹,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一拿撩、第九天 我趴在偏房一處隱蔽的房頂上張望柒莉。 院中可真熱鬧蓉驹,春花似錦菇绵、人聲如沸妆兑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稿静。三九已至秉沼,卻和暖如春桶雀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唬复。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工矗积, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盅抚。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓漠魏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妄均。 傳聞我的和親對象是個殘疾皇子柱锹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容