javascript - 仅在Mac以外的设备上添加子菜单项: Electron JS

标签 javascript menu electron menuitem

我想在Electron JS应用程序的"file"菜单项下添加一个“退出”子菜单项,但是仅在Windows和Linux上添加。在Mac上,我已经在“应用程序名称”菜单项下设置了“退出”子菜单项。目前,这是我的代码:

function createMenu(){
    const isMac = process.platform === 'darwin';
    const menu = [
        
        {
            label: "File",
            submenu: [
                {
                    label: 'Add expense',
                },
                !isMac && { 
                    label: 'Quit',
                    click(){
                        app.quit()
                    },
                    accelerator: 'Ctrl+Q'
                }
            ]
        },
        {
            label: "Menu2",
            submenu: [{label: 'Ok'}]
        }
    ];


    // Mac First Item in Template refers to app name (won't be able to override unless you package application)
    isMac && menu.unshift({
        label: app.name,
        submenu: [
            {
                label: 'About',
                click(){
                    open('https://www.google.com') // Using the open package
                }
            }, 
            {
                label: 'Quit',
                click(){
                    app.quit()
                },
                accelerator: 'Cmd+Q'
            }
        ]
    })


    return menu;
    
}
但是,当我运行此命令时,我收到一条错误消息:
TypeError: Invalid template for MenuItem: must have at least one of label, role or type
我应该怎么做呢?
谢谢!

最佳答案

由于尝试将对象有条件地插入列表文字中的方式而导致出现错误。

// The not macOS case:
> [ {"foo": 15}, true && {"bar": 123} ]
[ { foo: 15 }, { bar: 123 } ]

// The macOS case:
> [ {"foo": 15}, false && {"bar": 123} ]
[ { foo: 15 }, false ]
在后一种情况下,最终将false元素插入数组,这就是为什么会出现错误的原因。
如果要使用这样的速记,则可以使用:
> [ {"foo": 15}, ...(true?[{"bar": 123}]:[]) ]
[ { foo: 15 }, { bar: 123 } ]

> [ {"foo": 15}, ...(false?[{"bar": 123}]:[]) ]
[ { foo: 15 } ]
在您的用例中,这将使您:
const menu = [
    {
        label: "File",
        submenu: [
            {
                label: 'Add expense',
            },
            ...(!isMac)?[{ 
                label: 'Quit',
                click(){
                    app.quit()
                },
                accelerator: 'Ctrl+Q'
            }]:[]
        ]
    },
    {
        label: "Menu2",
        submenu: [{label: 'Ok'}]
    }
];
或者,您可以简单地调整菜单模板:
const menu = [
    {
        label: "File",
        submenu: [
            {
                label: 'Add expense',
            }
        ]
    },
    {
        label: "Menu2",
        submenu: [{label: 'Ok'}]
    }
];

if (!isMac) {
    menu[0]["submenu"].push({ 
        label: 'Quit',
        click(){
            app.quit()
        },
        accelerator: 'Ctrl+Q'
    })
}
使用哪一个取决于您;在第二种情况下,如果结构发生更改,则可能需要更新菜单地址。您还应该权衡可读性。

关于javascript - 仅在Mac以外的设备上添加子菜单项: Electron JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64143489/

相关文章:

javascript - 简化复选框链接的 jquery/javascript

javascript - 设置一个全局变量让jquery跨多个页面携带

javascript - Electron 存储 javascript 函数

angular - 如何在 Electron 应用程序外部复制和粘贴?

javascript - 发出 executeScript 权限

javascript - 从 url 调用 Nodejs 函数

javascript - 返回函数表达式而不是结果

twitter-bootstrap - Bootstrap 顶级菜单项在点击时不链接

jquery - 单击时清除 CSS 菜单悬停状态(通过 ajax 加载页面)

javascript - 如何制作 Electron 菜单在当前窗口进行通用搜索?