AntV G6图:右键菜单

1、右键菜单div

<template>
  <div class="space-wapper" @contextmenu.prevent="preventDefault">
    <!-- 画布 -->
    <div id="spaceGraph" ref="spaceGraphRef" class="space-graph"></div>
    <!-- 右键菜单 -->
    <div class="context-menu" id="contextMenu">
      <div class="del-text" v-if="delText.includes('删除')">
        {{ delText }}
      </div>
      <div class="add-text" v-else>{{ delText }}</div>
      <div class="add-text line-text">查看节点路线</div>
      <div class="del-text" v-if="lineList.length">清除节点路线</div>
    </div>
  </div>
</template>

2、右键菜单css

<style lang='scss' scoped>
.space-wapper {
  height: 100%;
  .space-graph {
    width: 100%;
    height: 100%;
    cursor: pointer;
  }
  .context-menu {
    position: absolute;
    top: -100px;
    left: -200px;
    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
    padding: 8px 12px;
    border: 1px solid #ebeef5;
    background-color: #fff;
    border-radius: 4px;
    .del-text {
      text-align: center;
      width: 110px;
      line-height: 30px;
      color: #f56c6c;
      background: #f5f5f5;
      border: 1px solid #f5ebeb;
      cursor: pointer;
      border-radius: 4px;
      &:hover {
        border-color: #fbc4c4;
      }
    }
    .add-text {
      text-align: center;
      width: 110px;
      line-height: 30px;
      color: #409eff;
      background: #ecf5ff;
      border: 1px solid #b3d8ff;
      cursor: pointer;
      border-radius: 4px;
      &:hover {
        border-color: #409eff;
      }
    }
    .line-text {
      margin: 8px 0px;
    }
  }
  .g6-tooltip {
    border: 1px solid #e2e2e2;
    border-radius: 4px;
    font-size: 12px;
    color: #545454;
    background-color: rgba(255, 255, 255, 0.9);
    padding: 10px 8px;
    box-shadow: rgb(174, 174, 174) 0px 0px 10px;
  }
  .g6-minimap {
    position: absolute;
    bottom: 2px;
    left: 1px;
    border: 1px solid #ccc;
    background: #fff;
  }
}
</style>

2、画布右键事件

   /**
     * 鼠标事件
     */
    mouseEvent() {
      const that = this;
      // 画布-右键:显示右键菜单
      that.graph.on("contextmenu", (ev) => {
        let menu = document.getElementById("contextMenu");
        // item 为空:画布空白处
        if (!ev.item) {
          that.delData = null;
          that.delText = "新建节点";
        } else {
          const type = ev.item._cfg.type;
          if (type === "node") {
            that.delData = ev.item._cfg.model.data;
            that.delText = "删除节点";
          }
          if (type === "edge") {
            that.delData = { relationId: ev.item._cfg.model.id };
            that.delText = "删除连线";
          }
        }
        menu.style.top = ev.canvasY + "px";
        menu.style.left = ev.canvasX + "px";
        // 阻止默认的右键菜单
        ev.preventDefault();
      });
      // 画布-单击:隐藏右键菜单
      that.graph.on("click", (ev) => {
        // item 为空:画布空白处
        if (!ev.item) {
          let menu = document.getElementById("contextMenu");
          menu.style.top = "-100px";
          menu.style.left = "-200px";
        }
      });
    },
### 实现在 Vue2 中使用 AntV X6 的自定义右键菜单 为了在 Vue2 项目中集成 AntV X6 并实现自定义右键菜单功能,可以采用类似于 Vue3 的方法来设置上下文菜单。以下是具体的方法: #### 安装依赖库 首先,在 Vue2 项目中安装必要的包,包括 `@imengyu/vue-contextmenu` 和其他可能需要的依赖项。 ```bash npm install @imengyu/vue-contextmenu antv/x6 --save ``` #### 配置全局组件 接着,在项目的入口文件(通常是 main.js 或者类似的初始化脚本)里引入并注册右键菜单插件。 ```javascript // 引入样式表 import '@imengyu/vue-contextmenu/dist/index.css'; // 注册VueContextMenu组件 import VueContextMenu from '@imengyu/vue-contextmenu'; Vue.use(VueContextMenu); ``` #### 创建形实例与配置右键选项 创建一个新的 JavaScript 文件用于封装 AntV X6 形对象以及关联其上的事件处理逻辑。这里展示了一个简单的例子,其中包含了添加节点时附带的一个名为 `contextmenu` 的工具条目。 ```javascript import { Graph } from '@antv/x6'; const graph = new Graph({ container: document.getElementById('container'), grid: true, }); graph.addNode({ shape: 'rect', width: 80, height: 40, label: 'Node A', x: 50, y: 50, tools:[ { name: 'contextmenu', args: { items: [ {label:'编辑', event:'edit'}, {label:'删除', event:'delete'} ] } }, ], }); ``` 对于上述代码中的 `items` 数组内的每一项都指定了一个标签和对应的触发事件名称;当用户点击这些菜单项之一时就会发出相应的事件通知给监听器[^1]。 #### 绑定事件处理器 最后一步是在 Vue 组件内部绑定好响应函数以便于捕获来自 AntV X6 发送过来的消息,并执行实际的操作比如修改数据模型或者更新视状态等动作。 ```html <template> <div id="app"> <!-- ... --> </div> </template> <script> export default { methods:{ handleEvent(eventType,node){ switch (eventType){ case 'edit': alert(`正在编辑 ${node.label}`); break; case 'delete': this.graph.removeCells([node.id]); break; } } }, mounted(){ // 假设已经存在一个叫this.graph的对象代表了之前建立好的Graph实例 this.graph.on('blank:click contextmenu:cell', ({ e, node }) => { if(e.type === 'contextmenu'){ let eventType = e.item.event; // 获取被选中的菜单项所携带的信息 this.handleEvent(eventType,node); } }); } }; </script> ``` 通过这种方式可以在 Vue2 应用程序里面成功地集成了 AntV X6 及其实现了基本的右键菜单交互特性[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值