antv/G6使用记录,调用save方法,对数据model进行改造,并重新渲染

4 篇文章 0 订阅
4 篇文章 0 订阅

antv/G6使用记录,调用save方法,对数据model进行改造,并重新渲染

  主要说明在使用antv/g6时,对于画布中的节点,做某种操作(例如改变节点的颜色等),保存数据,以供一个新的画布渲染的方法
  例子比较简单,不涉及太复杂的操作,先看下效果:
改变一下节点属性
  左侧的容器中是初始的画布,使用自定义的方式对菱形节点进行了注册(此方法为官方示例),点击按钮时将左侧的画布中的元素的数据模型进行保存,然后在右侧新创建一个graph,将保存的值稍加修改,然后进行渲染,就得到了右侧容器中的内容
  场景:

  • 例如点击节点时(单击或者双击),可以通过弹框的方式展示当前点击节点的属性信息,也就是节点的model,然后可以对其进行简单的修改,然后将修改后的值重新在画布中展示出来
  • antv/g6官方提供的示例中,可以实现流程图,针对于流程图(初始化时从后端获取数据),当流程进行中出现了变化操作(可以看做是某一具体的流程出现问题或者是进行到下一步),就可以对已经完成的流程进行编辑,然后在将数据保存至后端。(此处只是简单举个例子,如不恰当请忽略)

  旨在提供对于这种类似场景的一种解决思路,也欢迎评论告知更好的实现方式!
  下面是整体的实现代码,包括自定义节点、数据的保存、修改后的渲染等
  采用的是vue的组件的方式,如需查看效果,可直接复制完整代码至vue项目中进行查看,记得要对antv/g6进行安装,否则会报错。

antv/g6的安装方法
npm install --save @antv/g6

antv/g6的官方文档地址

<template>
  <div class="big_div">
    <div id="beforeChange"></div>
    <div id="afterChange"></div>
    <el-button type="primary" class="button_change" @click="changeAttr">查看效果</el-button>
  </div>
</template>

<script>
import G6 from '@antv/g6';
export default {
  name: 'changeNodeAttr',
  data () {
    return {
      currentGraph: null
    }
  },
  mounted () {
    this.initGraph()
  },
  methods: {
    initGraph () {
      let _that = this
      G6.registerNode('diamond', {
        draw (cfg, group) {
          // 如果 cfg 中定义了 style 需要同这里的属性进行融合
          const keyShape = group.addShape('path', {
            attrs: {
              path: this.getPath(cfg), // 根据配置获取路径
              stroke: cfg.color ? cfg.color : 'cyan', // 颜色应用到描边上,如果应用到填充,则使用 fill: cfg.color
              fill: cfg.fill ? cfg.fill : '#f5f5f5'
            },
            // must be assigned in G6 3.3 and later versions. it can be any value you want
            name: 'path-shape',
            // 设置 draggable 以允许响应鼠标的图拽事件
            draggable: true,
          });
          if (cfg.label) {
            // 如果有文本
            // 如果需要复杂的文本配置项,可以通过 labeCfg 传入
            // const style = (cfg.labelCfg && cfg.labelCfg.style) || {};
            // style.text = cfg.label;
            const label = group.addShape('text', {
              // attrs: style
              attrs: {
                x: 0, // 居中
                y: 0,
                textAlign: 'center',
                textBaseline: 'middle',
                text: cfg.label,
                fill: '#666',
              },
              // must be assigned in G6 3.3 and later versions. it can be any value you want
              name: 'text-shape',
              // 设置 draggable 以允许响应鼠标的图拽事件
              draggable: true,
            });
          }
          return keyShape;
        },
        // 返回菱形的路径
        getPath (cfg) {
          const size = cfg.size || [140, 140]; // 如果没有 size 时的默认大小
          const width = size[0];
          const height = size[1];
          //  / 1 \
          // 4     2
          //  \ 3 /
          const path = [
            ['M', 0, 0 - height / 2], // 上部顶点
            ['L', width / 2, 0], // 右侧顶点
            ['L', 0, height / 2], // 下部顶点
            ['L', -width / 2, 0], // 左侧顶点
            ['Z'], // 封闭
          ];
          return path;
        },
      }, 'single-node');
      let width = document.getElementById('beforeChange').scrollWidth
      let height = document.getElementById('beforeChange').scrollHeight
      const data = {
        nodes: [
          { id: 'node1', x: 150, y: 100, type: 'diamond' }, // 最简单的
          { id: 'node2', x: 148, y: 400, type: 'diamond', size: [80, 160] }, // 添加宽高
          { id: 'node3', x: 530, y: 130, color: 'red', type: 'diamond' }, // 添加颜色
          { id: 'node4', x: 550, y: 400, label: '菱形', type: 'diamond' }, // 附加文本
        ],
      };
      const graph = new G6.Graph({
        container: 'beforeChange',
        width,
        height,
        modes: {
          default: [
            'drag-canvas',
            'drag-node',
            'zoom-canvas'
          ]
        },
      });
      graph.data(data);
      graph.render();
      _that.currentGraph = graph
    },
    changeAttr () {
      let currentGraphNode = this.currentGraph.save()
      G6.registerNode('diamond_change', {
        draw (cfg, group) {
          // 如果 cfg 中定义了 style 需要同这里的属性进行融合
          const keyShape = group.addShape('path', {
            attrs: {
              path: this.getPath(cfg), // 根据配置获取路径
              stroke: cfg.color ? cfg.color : 'cyan', // 颜色应用到描边上,如果应用到填充,则使用 fill: cfg.color
              fill: cfg.fill ? cfg.fill : '#f5f5f5'
            },
            // must be assigned in G6 3.3 and later versions. it can be any value you want
            name: 'path-shape',
            // 设置 draggable 以允许响应鼠标的图拽事件
            draggable: true,
          });
          if (cfg.label) {
            // 如果有文本
            // 如果需要复杂的文本配置项,可以通过 labeCfg 传入
            // const style = (cfg.labelCfg && cfg.labelCfg.style) || {};
            // style.text = cfg.label;
            const label = group.addShape('text', {
              // attrs: style
              attrs: {
                x: 0, // 居中
                y: 0,
                textAlign: 'center',
                textBaseline: 'middle',
                text: cfg.label,
                fill: '#666',
              },
              // must be assigned in G6 3.3 and later versions. it can be any value you want
              name: 'text-shape',
              // 设置 draggable 以允许响应鼠标的图拽事件
              draggable: true,
            });
          }
          return keyShape;
        },
        // 返回菱形的路径
        getPath (cfg) {
          const size = cfg.size || [140, 140]; // 如果没有 size 时的默认大小
          const width = size[0];
          const height = size[1];
          //  / 1 \
          // 4     2
          //  \ 3 /
          const path = [
            ['M', 0, 0 - height / 2], // 上部顶点
            ['L', width / 2, 0], // 右侧顶点
            ['L', 0, height / 2], // 下部顶点
            ['L', -width / 2, 0], // 左侧顶点
            ['Z'], // 封闭
          ];
          return path;
        },
      }, 'single-node');
      let width = document.getElementById('afterChange').scrollWidth
      let height = document.getElementById('afterChange').scrollHeight
      const graph = new G6.Graph({
        container: 'afterChange',
        width,
        height,
        modes: {
          default: [
            'drag-canvas',
            'drag-node',
            'zoom-canvas'
          ]
        },
        defaultNode: {
          type: 'diamond_change'
        },
      });
      currentGraphNode.nodes.forEach(item => {
        item.color = this.getRandomColor()
        item.fill = this.getRandomColor()
        item.label = item.label ? item.label : "" + this.getRandomColor()
      })

      setTimeout(() => {
        graph.data(currentGraphNode);
        graph.render();
      }, 10)
    },
    getRandomColor () {
      var rand = Math.floor(Math.random() * 0xFFFFFF).toString(16);
      if (rand.length == 6) {
        return '#' + rand;
      } else {
        return this.getRandomColor();
      }
    }
  }
}
</script>

<style  scoped>
.big_div {
  width: 100%;
  height: 60%;
  display: flex;
  justify-content: space-around;
  align-items: center;
  margin: auto;
}
#beforeChange,
#afterChange {
  width: 45%;
  border: 1px solid green;
  height: 100%;
}
.button_change {
  position: absolute;
}
</style>

  相信细心的小伙伴已经看出来,对数据进行修改时,无论初始的model中是否存在该属性,只要在节点的注册方法里对对应的属性进行了注册,就可以使用。
 本篇内容就结束了,欢迎各位coder提出宝贵意见或者建议。
 Tips:初识G6的时候也是一脸的懵逼,因为业务需要不能直接使用官方提供的基本节点,需要自定义的方式来实现节点,然后加各种功能,过程还是比较曲折的。也十分感谢G6的团队提供了一个好的引擎。希望G6能越来越强大,在国产图可视化打出自己的天地!!!

### 回答1: ANTV G6是一款智能电视机顶盒,它不仅可以通过网络观看在线视频,还提供了离线文档的功能。 ANTV G6的离线文档功能允许用户在没有网络连接的情况下访问和浏览本地存储的文档文件。用户可以通过USB接口或者其他存储设备将文档文件导入到G6中,然后在离线状态下查看和编辑这些文档。 离线文档功能使得用户可以在没有网络的情况下继续处理文档工作,提高了工作和学习的效率。无论是在出差、旅行或者没有网络覆盖的地方,用户都可以依靠ANTV G6来查看和编辑文档,保证工作的顺利进行ANTV G6不仅支持常见的文档格式,如Word、Excel和PowerPoint,还支持PDF、TXT等多种格式。用户可以通过文件管理系统在G6中浏览并打开各种格式的文件,进行阅读、编辑和保存。 此外,ANTV G6的离线文档功能还提供了一些便捷的操作选项,如快速搜索、书签、阅读模式等。用户可以根据自己的需求和喜好进行设置,提高使用的便捷性和个性化。 总之,ANTV G6的离线文档功能为用户提供了更加便利和灵活的文档处理方式,无论是在有网络的情况下,还是在没有网络的环境中,用户都可以通过G6进行文档工作,提升工作和学习的效率。 ### 回答2: ANTV G6是一款智能电视盒子,它可以通过连接到网络收看各种在线视频内容。但是,ANTV G6也支持离线播放,即使在没有网络连接的情况下,用户也可以通过存储在盒子内部的离线文档来观看内容。 离线文档功能使得用户可以在没有网络时仍然享受丰富的内容。用户可以下载电影、电视剧、纪录片等视频文件,并将其保存在ANTV G6的存储空间内。用户还可以下载各种格式的音乐文件,创建自己的音乐库。此外,用户还可以下载电子书、漫画等文档文件,并通过ANTV G6的离线文档功能进行阅读。 ANTV G6的离线文档功能具有很高的灵活性和可定制性。用户可以根据自己的口味和需求,选择并下载自己喜欢的内容。而且,用户可以通过文件管理器轻松管理和排序这些离线文档,让自己的媒体库更加整洁有序。 总的来说,ANTV G6的离线文档功能为用户提供了便捷的娱乐方式。无论是在没有网络的地方、网络出现故障或者想要隐私地享受内容,用户都可以通过离线文档功能满足自己的需求。ANTV G6的离线文档功能成为用户对于这款智能电视盒子的一个重要选择因素。 ### 回答3: ANTV G6是一款智能电视盒子,它可以连接到电视并提供多种功能。ANTV G6支持离线文档功能,这意味着用户可以在没有网络连接的情况下访问和查阅文档。 离线文档功能非常实用,特别是在没有网络连接或网络不稳定的情况下。用户可以事先下载需要的文档,然后在没有网络时随时打开并查看。这样,即使用户没有互联网,也可以方便地查阅重要资料或文件。 ANTV G6的离线文档功能支持多种文档格式,如PDF、DOC、PPT等常见格式。用户可以通过安装相应的文档阅读器应用程序来打开和阅读这些文档。除了查看文档外,用户还可以进行一些基本的操作,如搜索、添加书签、标注等。 另外,ANTV G6的离线文档功能还提供了快速跳转和目录导航等便捷功能,使得用户能够更方便地浏览和定位到所需的内容。此外,ANTV G6还支持对文档进行分享,用户可以将文档分享给其他设备或其他用户。 总的来说,ANTV G6的离线文档功能为用户提供了便捷的文档访问和查阅体验。无论用户身处何地,只要有ANTV G6,就能够随时打开和浏览各种文件。这对于那些需要频繁查阅文档并且经常处于没有网络连接的环境中的用户来说,无疑是一项非常有用且实用的功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值