https://blog.csdn.net/yangchunshang/article/details/80883720

前言
antV G6相对而言是一个目前还处于较于不成熟的关系数据可视化引擎。因此在实习实现关系图的过程中遇到很大的坑。比如说高亮箭头及关联属性、关系图的缩放、以及由于G6是基于canvas原理所以无法对其绘制的节点局部添加事件。因此在此记录下自己在使用G6实现数据库关系图时使用到的一些及技术点。

一、关于G6中的on 事件

     on 事件监听

     参数  eventName{String} 事件名 callback{function}事件回调函数

     事件对象

{ 

     currentItem,   //drag 拖动子项

     currentShape    //drag 拖动图形

     shape ,              //图形对象

     item,                 //子项

     domEvent,        //原生的dom事件

      x,                     //图的横坐标

  y,            // 图纵坐标
  domX,         // dom横坐标
  domY,         // dom纵坐标
  action,       // 数据变更动作 add、update、remove、changeData
  toShape,      // mouseleave、dragleave 到达的图形
  toItem,       // mouseleave、dragleave 到达的子项
}

形如:
//1当点击选中某一个节点时对它做处理

         net.on('itemclick', function(ev){
         const item = ev.item;

         if(net.isNode(item)){ //判断对象是node

         .......

         }else if(net.isEdge(item)){//判断如果对象是edge

        .........

         }

二、关于G6中的鼠标事件
G6中关于on也定义了, 鼠标事件 :此类事件可以与前缀’’,’node’,’edge’,’item’等自由组合使用。

graph.on('click', (ev)=>{});             // 鼠标左键点击事件
graph.on('dblclick', (ev)=>{});          // 鼠标左键双击事件
graph.on('mouseenter', (ev)=>{});        // 鼠标移入事件
graph.on('mouseleave', (ev)=>{});        // 鼠标移除事件
graph.on('mousedown', (ev)=>{});         // 鼠标按下事件
graph.on('mouseup', (ev)=>{});           // 鼠标抬起事件
graph.on('mousemove', (ev)=>{});         // 鼠标移动事件
graph.on('dragstart', (ev)=>{});         // 鼠标开始拖拽事件
graph.on('drag', (ev)=>{});              // 鼠标拖拽事件
graph.on('dragend', (ev)=>{});           // 鼠标拖拽结束事件
graph.on('dragenter', (ev)=>{});         // 鼠标拖拽进入事件
graph.on('dragleave', (ev)=>{});         // 鼠标拖拽移出事件
graph.on('drop', (ev)=>{});              // 鼠标拖拽放置事件
graph.on('contextmenu', (ev)=>{});       // 菜单事件

其它事件

graph.on('keydown', function(ev){});             // 键盘按键按下事件
graph.on('keyup', function(ev){});               // 键盘按键抬起事件
graph.on('mousewheel', function(ev){});          // 鼠标滚轮事件
graph.on('beforechangesize', function(ev){})     // 画布尺寸变化前
graph.on('afterchangesize', function(ev){})      // 画布尺寸变化后
graph.on('beforeviewportchange', function(ev){}) // 视口变化前
graph.on('afterviewportchange', function(ev){})  // 视口变化后
graph.on('beforechange', function(ev){})         // 子项数据变化前
graph.on('afterchange', function(ev){})          // 子项数据变化后

三、关于一些方法
(1)find —–查询方法

  net.find  或者graph.find(id);      //前者为旧版,后者为新版

其中参数:id {string}项 id

返回 item{object || undefined}

查询成功返回项对象,否则返回 undefinde

eg:

  let current_tablename=net.find(ev.item.get('model').id).get('model').name;

(2)add ——添加方法

新增项

    graph.add(type,model)

参数 type {string} 项类型 可以是 node 、edge 、guide model {object} 数据模型

(3)update —更新项(需要对数据有一些局部更新时,比如某个node节点、或edge等有什么样式或数据的更改可以使用此方法)记得灵活使用。

参数: item {string || object} 项对象 或项id model{object} 数据模型

示例:

       net.update(item, {   //为项对象

          color: 'red'
          });
          net.update(from_id,{ //即为 id对象
           color:'red',
           fields:fromfields
          });

四、each{Function}——-遍历数组或对象

/*

     遍历数组或者对象

     @param {Object|Array} element/Object 数组中元素或对象的值

     @param {Function} func 遍历的函数 function(elememt,index){} 或者 function(value,key){}

 */

   G6.Util.each(elements,func);

  eg:

    let current_fields=net.find(ev.item.get('model').id).get('model').fields;//获取关联表中的字段

          let this_fields=[];
          Util.each(current_fields,function(field, i){
              let str = field.field;
              str = str.replace(/<[^>]+>/g,"");
              this_fields.push(str);
            //  fields+=str+"\n";
          });

五、总结
对于antV G6里面的使用主要用到以上几个方法。通过历时半个月的时间,而且自己正处于它版本更迭的期间学习使用的,前期学习旧版的一些知识在新版上是不可行的,因此花费了自己大量的时间在这上面。不过个人感觉相比D3等其它可视化工具的学习成本而言,对于短期要实现关系图,选择antV G6相对明智。尽管它的文档实例等并不全面,而且处于早期开发中。

如果想要更加深入的了解,可上官网学习或加入他们的钉钉群。
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/yangchunshang/article/details/80883720

文档更新时间: 2024-04-05 16:13   作者:admin