React使用AntV G6实现流程图
安装
npm install @antv/g6 --save
引用
import G6 from '@antv/g6'
自定义节点
/**
 * 方式一
 */
G6.registerNode('rect-jsx', (cfg) =>`
<group>
  <rect>
    <rect style={{
      width: 160,
      height: 20,
      fill: ${cfg.color},
      cursor: 'move',
      stroke: ${cfg.color}
    }} draggable="true">
      <text style={{
        marginTop: 2,
        marginLeft: 75,
        textAlign: 'center',
        fontWeight: 'bold',
        fill: '#333' }}>自定义文字</text>
    </rect>
    <rect style={{
      width: 160,
      height: 55,
      stroke: ${cfg.color},
      fill: ${cfg.color},
    }} draggable="true">
      <text style={{ marginTop: 5, marginLeft: 3, fill: '#333', marginLeft: 4 }}> {{label}}</text>
      <text style={{ marginTop: 10, marginLeft: 3, fill: '#333', marginLeft: 4 }}>{{statusDesc}}</text>
    </rect>
</group>
`)
/**
 * 方式二
 */
G6.registerNode(
  'card-node',
  {
    drawShape: function drawShape(cfg, group) {
      const color = cfg.error ? '#F4664A' : '#30BF78';
      const r = 2;
      const shape = group.addShape('rect', {
        attrs: {
          x: 0,
          y: 0,
          width: 200,
          height: 60,
          stroke: color,
          radius: r,
        },
        name: 'main-box',
        draggable: true,
      });
      group.addShape('rect', {
        attrs: {
          x: 0,
          y: 0,
          width: 200,
          height: 20,
          fill: color,
          radius: [r, r, 0, 0],
        },
        name: 'title-box',
        draggable: true,
      });
      // left icon
      group.addShape('image', {
        attrs: {
          x: 4,
          y: 2,
          height: 16,
          width: 16,
          cursor: 'pointer',
          img: ICON_MAP[cfg.nodeType || 'app'],
        },
        name: 'node-icon',
      });
      // title text
      group.addShape('text', {
        attrs: {
          textBaseline: 'top',
          y: 2,
          x: 24,
          lineHeight: 20,
          text: cfg.title,
          fill: '#fff',
        },
        name: 'title',
      });
      if (cfg.nodeLevel > 0) {
        group.addShape('marker', {
          attrs: {
            x: 184,
            y: 30,
            r: 6,
            cursor: 'pointer',
            symbol: cfg.collapse ? G6.Marker.expand : G6.Marker.collapse,
            stroke: '#666',
            lineWidth: 1,
          },
          name: 'collapse-icon',
        });
      }
      // The content list
      cfg.panels.forEach((item, index) => {
        // name text
        group.addShape('text', {
          attrs: {
            textBaseline: 'top',
            y: 25,
            x: 24 + index * 60,
            lineHeight: 20,
            text: item.title,
            fill: 'rgba(0,0,0, 0.4)',
          },
          name: `index-title-${index}`,
        });
        // value text
        group.addShape('text', {
          attrs: {
            textBaseline: 'top',
            y: 42,
            x: 24 + index * 60,
            lineHeight: 20,
            text: item.value,
            fill: '#595959',
          },
          name: `index-title-${index}`,
        });
      });
      return shape;
    },
  },
  'single-node',
);
绑定事件
   graph.on('aftercreateedge', e => {
    })
    graph.on('click', (evt) => {
    });
    graph.on('node:dblclick', evt => {
    })
连线控制
          {
            type: 'create-edge',
            trigger: 'click',
            key: 'shift',
            shouldBegin: e => {
              this.setState({begin: e.item._cfg.id})
              return true
            },
            shouldEnd: e => {
              let flag = true
              this.state.edges.forEach(item => {
                if (this.state.begin === item.source) {
                  if (e.item._cfg.id === item.target) {
                    flag = false
                  }
                }
              })
              return flag
          }
根据坐标返回位置信息
      const { item } = evt
      const model = item.getModel()
      const { x, y } = model
      const point = graph.getCanvasByPoint(x, y)
注意事项
在数据源多次变化时先需要销毁画布
this.graph.destroy()
详细的边文字、节点提示等等,官方文档介绍的很多,这里介绍React的简单实现,供大家少走弯路。官方链接:https://g6.antv.vision/zh
React使用AntV G6实现流程图的更多相关文章
- AntV G6绘制流程图学习例子
		下面代码可以直接贴到html文件中运行看效果. 代码说明 js中data是一个json变量,里面有两个关键对象"nodes.edges",分别来描述节点.节点间箭线. 更多&quo ... 
- antV G6流程图在Vue中的使用
		最近我司项目中需要加入流程图制作功能,于是乎百度各种找可视化绘制拓扑图的轮子,大部分都是国外的,看文档太吃力,不过好在最终让我发现了AntV G6流程图图表库,最新版为2.0,不过编辑器在2.0版本还 ... 
- React + umi +antd+antv/g6 实现力图
		官方示例效果:http://antv.alipay.com/zh-cn/g6/2.x/demo/net/2017-link-data.html 改编效果: 实现步骤: 环境:nodejs.yarn/n ... 
- vue结合antV/g6 实现网络拓扑图
		最近很多业务场景都会需要用到拓扑图,翻找了很多资料,最后选择了antV/g6,主要原因有以下几点: 1.阿里出品,所以框架的成熟性有保障 2.业务场景契合(1.规则拓扑图:2.动画流向:每个节点会有流 ... 
- antv g6
		<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ... 
- 在 React 项目中引入 GG-Editor 编辑可视化流程
		蚂蚁金服数据可视化团队曾经开源了一款G6-Editor,但后来停止了对外支持,学习成本太高 好在后来他们团队的大牛高力结合 React + G6 开源了一个 GG-Editor(其实就是G6-Edit ... 
- G6 学习资料
		G6 学习资料 网址 G6 1.x API 文档 http://antvis.github.io/g6/doc/index.html 官方demo列表 https://github.com/antvi ... 
- React 生命周期简介
		React 中组件的生命周期会经历如下三个过程:装载过程.更新过程.卸载过程. 装载过程:组件实例被创建和插入 DOM 树的过程: 更新过程:组件被重新渲染的过程: 卸载过程:组件从 DOM 树 ... 
- ggEditor流程图增加网格背景
		参考官方文档: https://www.yuque.com/antv/g6/plugin.tool.grid react-ggEditor如何使用 import { Flow } from 'gg-e ... 
随机推荐
- AOP计算方法执行时长
			AOP计算方法执行时长 依赖引入 <dependency> <groupId>org.springframework.boot</groupId> <arti ... 
- 第1篇 Scrum冲刺博客
			一.Alpha阶段各成员任务 梁天龙 任务名称 预计工时 编辑历史记录 2 登陆按键设计 3 考勤记录页面 2 人数记录页面 2 学习课程页面 4 建议页面 2 黄岳康 任务名称 ... 
- 牛客网PAT练兵场-组个最小数
			题解:从小到大输出 题目地址:https://www.nowcoder.com/questionTerminal/86ede762b450404dbab59352963378e9 /** * *作者: ... 
- oracle备份之备份测试脚本(冷备、热备、rman)
			1.数据库环境 数据库DBID及打开模式SQL> select dbid,open_mode from v$database; DBID OPEN_MODE---------- -------- ... 
- Laravel Reponse  响应客户端
			Laravel Response 响应客户端 本篇文章逻辑较长,只说明和响应生命周期相关的必要代码. 本文主要内容顺序为: 1.执行上文管道中的then方法指定的闭包,路由的分发 2.在路由器中(Ro ... 
- 攻防世界——Misc新手练习区解题总结<1>(1-4题)
			第一题this_if_flag: 第一题就不多说了,题目上就给出了flag复制粘贴就可以了 第二题pdf: 下载附件后,得到如下界面 Ctrl+a全选文字,复制出来看看是什么,粘贴后恰好得到flag ... 
- Typed Lua
			https://the-ravi-programming-language.readthedocs.io/en/latest/ravi-overview.html https://github.com ... 
- 利用阿里云服务器免费体验word press博客、个人网站
			本文首发于我的个人博客:https://chens.life/create-wordpress-blog.html 前言 目前市面上有许许多多的虚拟云服务器ECS,例如阿里云.华为云.又拍云等等,他们 ... 
- Java8 ParallelStream
			ParallelStream 并行流就是一个把内容拆分成多个数据块,用不同线程分别处理每个数据块的流.对收集源调用parallelStream方法就能将集合转换为并行流. 并行流 并行流和顺序流转换 ... 
- [LeetCode题解]79. 单词搜索
			题目描述 题目:79. 单词搜索 解题思路 遍历 首先找重复性,题目说给定单词是否存在于二维数组中,可以简化为从 (x, y) 走 n 步(n 表示单词长度),查看给定单词是否存在.然后再遍历二维数组 ... 
