上下文菜单网页显示技术研究

举报
Jet Ding 发表于 2020/09/28 17:20:18 2020/09/28
【摘要】 最近收到调研需求,是关于jQuery-contextMenu的替换研究。我们先来看看这个库是干什么的。

1      引言

最近收到调研需求,是关于jQuery-contextMenu的替换研究。我们先来看看这个库是干什么的。

$.contextMenu是一个管理设施,就是上下文菜单。它是为了可以为数百个元素显示上下文菜单的应用而设计的,所以初始化速度和内存使用量都相当小。它还允许注册上下文菜单而不提供实际的标记,因为$.contextMenu会根据需要生成DOME元素。

下面是一个运行效果图:

2      依赖

jQuery >=1.8.2

jQuery UI位置(可选,但推荐)

3      用例

<span class="context-menu-one btn btn-neutral">right click me</span>

 

 

$(function() {

  $.contextMenu({

      selector: '.context-menu-one'

      callback: function(keyoptions) {

          var m = "clicked: " + key;

          window.console && console.log(m) || alert(m); 

      },

      items: {

          "edit": {name: "Edit"icon: "edit"},

          "cut": {name: "Cut"icon: "cut"},

         copy: {name: "Copy"icon: "copy"},

          "paste": {name: "Paste"icon: "paste"},

          "delete": {name: "Delete"icon: "delete"},

          "sep1": "---------",

          "quit": {name: "Quit"icon: function(){

              return 'context-menu-icon context-menu-icon-quit';

          }}

      }

  });

 

  $('.context-menu-one').on('click'function(e){

      console.log('clicked'this);

  })    

});

 

4      可能的替换库

4.1    react-contextmenu

React中支持可访问性的ContextMenu

4.1.1    运行效果

4.1.2    最新版本

2.14.0  20206

4.1.3    License

MIT

4.1.4    官方地址

https://github.com/vkbansal/react-contextmenu

4.1.5    安装

npm install --save react-contextmenu

4.1.6    使用

import React from "react";

import ReactDOM from "react-dom";

import { ContextMenuMenuItemContextMenuTrigger } from "react-contextmenu";

 

function handleClick(edata) {

  console.log(data.foo);

}

 

function MyApp() {

  return (

    <div>

      {/* 注意:id在每一对<ContextMenuTrigger><ContextMenu>中必须是唯一的。 */}

      <ContextMenuTrigger id="same_unique_identifier">

        <div className="well">Right click to see the menu</div>

      </ContextMenuTrigger>

 

      <ContextMenu id="same_unique_identifier">

        <MenuItem data={{foo: 'bar'}} onClick={this.handleClick}>

          ContextMenu Item 1

        </MenuItem>

        <MenuItem data={{foo: 'bar'}} onClick={this.handleClick}>

          ContextMenu Item 2

        </MenuItem>

        <MenuItem divider />

        <MenuItem data={{foo: 'bar'}} onClick={this.handleClick}>

          ContextMenu Item 3

        </MenuItem>

      </ContextMenu>

 

    </div>

  );

}

 

ReactDOM.render(<MyApp myProp={12}/>, document.getElementById("main"));

 

4.2    ngx-contextmenu

ui.bootstrap.contextMenu启发,使用Angular构建的上下文菜单。标注中包含了Bootstrap类,但没有明确依赖Bootstrap

4.2.1    运行效果

4.2.2    最新版本

5.4.0  20202

4.2.3    License

MIT

4.2.4    官方地址

https://github.com/isaacplmann/ngx-contextmenu

4.2.5    安装

npm install ngx-contextmenu @angular/cdk

4.2.6    使用

@Component({

  ...

})

export class MyContextMenuClass {

  public items = [

      { name: 'John'otherProperty: 'Foo' },

      { name: 'Joe'otherProperty: 'Bar' }

  ];

  @ViewChild(ContextMenuComponentpublic basicMenuContextMenuComponent;

}

 

 

<ul>

    <li *ngFor="let item of items" [contextMenu]="basicMenu" [contextMenuSubject]="item">Right Click: {{item?.name}}</li>

</ul>

<context-menu>

  <ng-template contextMenuItem (execute)="showMessage('Hi, ' + $event.item.name)">

    Say hi!

  </ng-template>

  <ng-template contextMenuItem divider="true"></ng-template>

  <ng-template contextMenuItem let-item (execute)="showMessage($event.item.name + ' said: ' + $event.item.otherProperty)">

    Bye, {{item?.name}}

  </ng-template>

  <ng-template contextMenuItem passive="true">

    Input something: <input type="text">

  </ng-template>

</context-menu>

 

4.3    PrimeNG ContextMenu

ContextMenu在右击目标时显示一个叠加菜单。这个页面有两个菜单,一个是文档菜单,一个是图片菜单。

4.3.1    运行效果

4.3.2    最新版本

9.1.0  20205

4.3.3    License

MIT

4.3.4    官方地址

https://github.com/primefaces/primeng

4.3.5    安装

npm install primeng --save

npm install primeicons --save

在样式部分配置所需的样式,下面的例子使用Nova Light主题。

  "styles": [

              "node_modules/primeng/resources/themes/nova-light/theme.css",

              "node_modules/primeng/resources/primeng.min.css",

              "node_modules/primeicons/primeicons.css",

              //...

            ],

 

4.3.6    使用

 

import {ContextMenuModulefrom 'primeng/contextmenu';

import {MenuItemfrom 'primeng/api';

 

<p-contextMenu [global]="true" [model]="items"></p-contextMenu>

 

 

 

export class ContextMenuDemo {

 

  private itemsMenuItem[];

 

  ngOnInit() {

      this.items = [

          {

              label: 'File',

              items: [{

                      label: 'New'

                      icon: 'pi pi-fw pi-plus',

                      items: [

                          {label: 'Project'},

                          {label: 'Other'},

                      ]

                  },

                  {label: 'Open'},

                  {label: 'Quit'}

              ]

          },

          {

              label: 'Edit',

              icon: 'pi pi-fw pi-pencil',

              items: [

                  {label: 'Delete'icon: 'pi pi-fw pi-trash'},

                  {label: 'Refresh'icon: 'pi pi-fw pi-refresh'}

              ]

          }

      ];

  }

}

 

 

4.4    PrimeReact-ContextMenu

ContextMenu在右击目标时显示一个覆盖菜单。

4.4.1    运行效果

4.4.2    最新版本

4.2.2  20206

4.4.3    License

MIT

4.4.4    官方地址

https://github.com/primefaces/primereact

4.4.5    安装

npm install primereact --save
npm install primeicons --save

4.4.6    使用

import {ContextMenufrom 'primereact/contextmenu';

 

<ContextMenu model={items}/>

 

const items:[

  {

  //...

  },

  {

     separator:true

  },

  {

     label:'Quit',

     icon:'pi pi-fw pi-power-off'

  }

];

 

4.5    PrimeVue-ContextMenu

ContextMenu在右击目标时显示一个覆盖菜单。

4.5.1    运行效果

4.5.2    最新版本

2.0.0.rc.1  20205

4.5.3    官方地址

https://github.com/primefaces/primevue

4.5.4    License

MIT

4.5.5    安装

npm install primevue --save
npm install primeicons --save

4.5.6    使用 

import ContextMenu from 'primevue/contextmenu';

 

<ContextMenu :global="true" :model="items" />

 

export default {

  data() {

      return {

          items: [

              {

                 label:'File',

                 icon:'pi pi-fw pi-file',

              },

              {

                 separator:true

              },

              {

                 label:'Quit',

                 icon:'pi pi-fw pi-power-off'

              }

           ]

      }

  }

}

 

4.6    antd-React

 

可以通过DropDown来显示上下文菜单

4.6.1    运行效果

4.6.2    最新版本

4.3.5  20206

4.6.3    官方地址

https://github.com/ant-design/ant-design

4.6.4    License

MIT

4.6.5    安装

npm install antd

4.6.6    使用

import 'antd/dist/antd.css';

 

import { Menu, Dropdown } from 'antd';

 

const menu = (

  <Menu>

    <Menu.Item key="1">1st menu item</Menu.Item>

    <Menu.Item key="2">2nd menu item</Menu.Item>

    <Menu.Item key="3">3rd menu item</Menu.Item>

  </Menu>

);

 

ReactDOM.render(

  <Dropdown overlay={menu} trigger={['contextMenu']}>

    <div

      className="site-dropdown-context-menu"

      style={{

        textAlign: 'center',

        height: 200,

        lineHeight: '200px',

      }}

    >

      Right Click on here

    </div>

  </Dropdown>,

  document.getElementById('container'),

);

 

4.7    antd-Angular

可以通过DropDown来显示上下文菜单

4.7.1    运行效果

4.7.2    最新版本

9.2.1  20206

4.7.3    官方地址

https://github.com/NG-ZORRO/ng-zorro-antd

4.7.4    License

MIT

4.7.5    安装

npm install ng-zorro-antd

4.7.6    使用

引入模块:

 

import { NzButtonModule } from 'ng-zorro-antd/button';

 

@NgModule({

  imports: [ NzButtonModule ]

})

export class AppModule {

}

 

 并在angular.json中导入样式和SVG图标资产文件链接。:

{

  "assets": [

  {

    "glob": "**/*",

    "input": "./node_modules/@ant-design/icons-angular/src/inline-svg/",

    "output": "/assets/"

  }

  ],

  "styles": [

  "node_modules/ng-zorro-antd/ng-zorro-antd.min.css"

  ]

}

 

 

模板:

 

<div class="context-area" (contextmenu)="contextMenu($event, menu)">

Right Click on here

</div>

<nz-dropdown-menu #menu="nzDropdownMenu">

<ul nz-menu>

  <li nz-menu-item>1st menu item</li>

  <li nz-menu-item>2nd menu item</li>

  <li nz-menu-item nzDisabled>disabled menu item</li>

  <li nz-submenu nzTitle="sub menu">

    <ul>

      <li nz-menu-item>3rd menu item</li>

      <li nz-menu-item>4th menu item</li>

    </ul>

  </li>

  <li nz-submenu nzDisabled nzTitle="disabled sub menu">

    <ul>

      <li nz-menu-item>3rd menu item</li>

      <li nz-menu-item>4th menu item</li>

    </ul>

  </li>

</ul>

</nz-dropdown-menu>

 

风格定制:

styles: [

  `

    .context-area {

      background: #f7f7f7;

      color: #777;

      text-align: center;

      height: 200px;

      line-height: 200px;

    }

  `

]

 

 组件代码:

export class NzDemoDropdownContextMenuComponent {

  contextMenu($event: MouseEvent, menu: NzDropdownMenuComponent): void {

    this.nzContextMenuService.create($event, menu);

  }

 

  closeMenu(): void {

    this.nzContextMenuService.close();

  }

 

  constructor(private nzContextMenuService: NzContextMenuService) {}

}

 

4.8    ant-design-vue

可以通过DropDown来显示上下文菜单

4.8.1    运行效果

4.8.2    最新版本

1.6.2  20206

4.8.3    官方地址

https://github.com/vueComponent/ant-design-vue

4.8.4    License

MIT

4.8.5    安装

npm install ant-design-vue --save

4.8.6    使用

import Antd from 'ant-design-vue';

 

Vue.use(Antd);

 

 

<template>

  <a-dropdown :trigger="['contextmenu']">

    <div

      :style="{

        textAlign'center',

        background'#f7f7f7',

        height'200px',

        lineHeight'200px',

        color'#777',

      }"

    >

      Right Click on here

    </div>

    <a-menu slot="overlay">

      <a-menu-item key="1">

        1st menu item

      </a-menu-item>

      <a-menu-item key="2">

        2nd menu item

      </a-menu-item>

      <a-menu-item key="3">

        3rd menu item

      </a-menu-item>

    </a-menu>

  </a-dropdown>

</template>

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。