vue 使用 AntV X6 绘制流程图

vue 使用 AntV X6 绘制流程图

在这里插入图片描述
在这里插入图片描述

安装及使用

  1. 通过 npm 命令 node16 X6。

    npm install @antv/x6 --save

  2. 在使用的页面用 import 进行引用。

    import { Graph } from ‘@antv/x6’;

  3. 在页面中创建一个用于容纳 X6 绘图的容器,可以是一个 div 标签。
<div id='container1' class='step-box' ref='stepBox'></div>
  1. X6 支持 JSON 格式数据,该对象中需要有节点 nodes 和边 edges 字段,分别用数组表示:
let nodeList = [
  {
    id: 'START', // String,可选,节点的唯一标识
     x: 40, // Number,必选,节点位置的 x 值
      y: 40, // Number,必选,节点位置的 y 值
      width: 150, // Number,可选,节点大小的 width 值
      height: 60, // Number,可选,节点大小的 height 值
      label: 'node1', // String,节点标签
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#6bcd92' },// 边框颜色
      label: { text: 'node1', fill: '#6bcd92', fontSize: 24 }
    },
    data: { disableMove: false }//true为可拖拽,false不可拖拽
  },
  {
    id: 'node2',
    x: 280,
    y: 40,
    width: 150,
    height: 60,
    label: 'node2',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#6bcd92', cursor: 'pointer' },
      label: { text: 'node2', fill: '#6bcd92', fontSize: 24, cursor: 'pointer' }
    },
    data: { disableMove: false }
  },
  {
    id: 'node3',
    x: 520,
    y: 40,
    width: 150,
    height: 60,
    label: 'node3',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#6bcd92', cursor: 'pointer' },
      label: { text: 'node3', fill: '#6bcd92', fontSize: 24, cursor: 'pointer' }
    },
    data: { disableMove: false }
  },
  {
    id: 'node4',
    x: 520,
    y: 160,
    width: 150,
    height: 60,
    label: 'node4',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#6bcd92', cursor: 'pointer' },
      label: { text: 'node4', fill: '#6bcd92', fontSize: 24, cursor: 'pointer' }
    },
    data: { disableMove: false }
  },
  {
    id: 'node5',
    x: 760,
    y: 40,
    width: 150,
    height: 60,
    label: 'node5',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#6bcd92', cursor: 'pointer' },
      label: { text: 'node5', fill: '#6bcd92', fontSize: 24, cursor: 'pointer' }
    },
    data: { disableMove: false }
  },
  {
    id: 'node6',
    x: 1000,
    y: 40,
    width: 150,
    height: 60,
    label: 'node6',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#6bcd92', cursor: 'pointer' },
      label: { text: 'node6', fill: '#6bcd92', fontSize: 24, cursor: 'pointer' }
    },
    data: { disableMove: false }
  },
  {
    id: 'node7',
    x: 1000,
    y: 160,
    width: 150,
    height: 60,
    label: 'node7',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#6bcd92', cursor: 'pointer' },
      label: { text: 'node7', fill: '#6bcd92', fontSize: 24, cursor: 'pointer' }
    },
    data: { disableMove: false }
  },
  {
    id: 'node8',
    x: 1240,
    y: 40,
    width: 150,
    height: 60,
    label: 'node8',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#6bcd92', cursor: 'pointer' },
      label: { text: 'node8', fill: '#6bcd92', fontSize: 24, cursor: 'pointer' }
    },
    data: { disableMove: false }
  },
  {
    id: 'node9',
    x: 1480,
    y: 40,
    width: 150,
    height: 60,
    label: 'node7',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#6bcd92', cursor: 'pointer' },
      label: { text: 'node7', fill: '#6bcd92', fontSize: 24, cursor: 'pointer' }
    },
    data: { disableMove: false }
  },
  {
    id: 'node10',
    x: 1720,
    y: 40,
    width: 150,
    height: 60,
    label: 'node10',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#6bcd92', cursor: 'pointer' },
      label: {
        text: 'node10',
        fill: '#6bcd92',
        fontSize: 24,
        cursor: 'pointer'
      }
    },
    data: { disableMove: false }
  },
  {
    id: 'node11',
    x: 1960,
    y: 40,
    width: 150,
    height: 60,
    label: 'node11',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#e7ba7a', cursor: '' },
      label: { text: 'node11', fill: '#e7ba7a', fontSize: 24, cursor: '' }
    },
    data: { disableMove: false }
  },
  {
    id: 'node12',
    x: 2200,
    y: 40,
    width: 150,
    height: 60,
    label: 'node12',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#a6a6a6', cursor: '' },
      label: { text: 'node12', fill: '#a6a6a6', fontSize: 24, cursor: '' }
    },
    data: { disableMove: false }
  },
  {
    id: 'node13',
    x: 2440,
    y: 40,
    width: 150,
    height: 60,
    label: 'node13',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#a6a6a6', cursor: '' },
      label: { text: 'node13', fill: '#a6a6a6', fontSize: 24, cursor: '' }
    },
    data: { disableMove: false }
  },
  {
    id: 'node14',
    x: 2440,
    y: 160,
    width: 150,
    height: 60,
    label: 'node14',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#6bcd92', cursor: 'pointer' },
      label: {
        text: 'node14',
        fill: '#6bcd92',
        fontSize: 24,
        cursor: 'pointer'
      }
    },
    data: { disableMove: false }
  },
  {
    id: 'node15',
    x: 2680,
    y: 40,
    width: 150,
    height: 60,
    label: 'node15',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#a6a6a6', cursor: '' },
      label: { text: 'node15', fill: '#a6a6a6', fontSize: 24, cursor: '' }
    },
    data: { disableMove: false }
  },
  {
    id: 'node16',
    x: 2920,
    y: 40,
    width: 150,
    height: 60,
    label: 'node16',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#a6a6a6', cursor: '' },
      label: { text: 'node16', fill: '#a6a6a6', fontSize: 24, cursor: '' }
    },
    data: { disableMove: false }
  },
  {
    id: 'node17',
    x: 3160,
    y: 40,
    width: 150,
    height: 60,
    label: 'node17',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#a6a6a6', cursor: '' },
      label: { text: 'node17', fill: '#a6a6a6', fontSize: 24, cursor: '' }
    },
    data: { disableMove: false }
  },
  {
    id: 'FINISH',
    x: 3400,
    y: 40,
    width: 150,
    height: 60,
    label: 'node18',
    attrs: {
      body: { rx: 12, ry: 12, stroke: '#a6a6a6' },
      label: { text: 'node18', fill: '#a6a6a6', fontSize: 24 }
    },
    data: { disableMove: false }
  }
]
let edgesList = [
  {
    source: 'START', // 起始节点 id
    target: 'node2', // 目标节点 id
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node2',
    target: 'node3',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node2',
    target: 'node4',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node3',
    target: 'node5',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node4',
    target: 'node6',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node5',
    target: 'node6',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node6',
    target: 'node8',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node6',
    target: 'node7',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node7',
    target: 'node14',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node8',
    target: 'node9',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node9',
    target: 'node10',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node10',
    target: 'node11',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node11',
    target: 'node12',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node12',
    target: 'node13',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node13',
    target: 'node15',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node14',
    target: 'node15',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node15',
    target: 'node16',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node16',
    target: 'node17',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  },
  {
    source: 'node17',
    target: 'FINISH',
    router: { name: 'manhattan' },
    connector: { name: 'rounded' },
    attrs: { line: { stroke: '#a6a6a6', targetMarker: 'classic' } }
  }
]
  1. 渲染画布
  • 创建一个 Graph 对象,并为其指定一个页面上的绘图容器,通常也会指定画布的大小
const graph = new Graph({
  container: document.getElementById('container1'),
  height: this.$refs.stepBox.clientHeight,
  panning: true, //是否支持拖拽平移
  resizing: true,
  interacting: function (cellView) {
    // 'nodeMovable' 节点是否可以被移动。
    if (
      cellView.cell.getData() != undefined &&
      !cellView.cell.getData().disableMove
    ) {
      return { nodeMovable: false }
    }
    return true
  }
})
// 通过当前浏览器缩放计算流程图的缩放值
if (window.devicePixelRatio <= 1) {
  graph.scale(1)
} else {
  graph.scale(document.documentElement.clientWidth / window.screen.width)
}
  • 使用刚刚创建的 graph 来渲染我们的节点和边
const data = {
  // 节点
  nodes: nodeList,
  // 边
  edges: edgesList
}
graph.fromJSON(data)
  1. 此时我们的流程图就全部渲染完成了
其他显示方式

如果流程节点想要展示一个title或者其他信息以这种方式展示,如图
在这里插入图片描述

  • 需要单个设置每个label块的字号及节点块背景
graph.addNode({
  shape: 'path',
  x: 200,
  y: 40,
  width: 150,
  height: 90,
  label: 'path',
  markup: [
              {
                tagName: 'rect',
                selector: 'body',
              },
              {
                tagName: 'rect',
                selector: 'name-rect',
              },
              {
                tagName: 'path',
                selector: 'attrs-rect',
              },
              // {
              //   tagName: 'rect',
              //   selector: 'border-rect',
              // },
              {
                tagName: 'text',
                selector: 'name-text',
              },
              {
                tagName: 'text',
                selector: 'attrs-text',
              }
            ],
            attrs: {
              body: {
                width: 150,
  height: 90,
                rx: 12,
                ry: 12,
                stroke: '#000',// 边框颜色
              },
              'name-text': {
                text: 'aa',
                fill: '#000',
                fontSize: 24,
               
                refY: 60,
              },
              'name-rect': {
                fill: '#000',
              },
              // 'border-rect': {
              //   width: 150,
              //   height:1,
              //   fill: 'none',
              //   stroke:'#b1b1b1',
              //   refY: 45,
              // },
              'attrs-rect': {
                d: 'M 12 0 L 138 0 L 149 7 L 149 35 L 0 35 L 0 7 Z',
               
                fill: '#b1b1b1',
                // refY: 0
              },
              'attrs-text': {
                text: '标题',
                fill: '#ffffff',
                fontSize: 22,
               
                refY: 20,
                // refX: 55,
              }
            },
})
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Vue是一种流行的JavaScript框架,Vue 2是其第二个版本。AntV X6是一个基于Vue 2的图表绘制库,可以用于绘制各种类型的图表,包括树形流程图。 要在Vue 2项目中使用AntV X6绘制树形流程图,首先需要安装和引入AntV X6库。可以通过npm或yarn进行安装: npm install @antv/x6 或者 yarn add @antv/x6 然后,可以在Vue的组件中使用AntV X6。首先,引入`Graph`和`Node`组件: import { Graph, Node } from '@antv/x6-vue' 接下来,在Vue的模板中添加一个`Graph`组件,并设置一些必要的属性: ``` <template> <div> <Graph :initConfig="graphConfig"> <Node :shape="nodeShape" :x="nodeX" :y="nodeY" :width="nodeWidth" :height="nodeHeight" /> </Graph> </div> </template> <script> export default { data() { return { graphConfig: { width: 800, height: 600, gridSize: 10, background: { color: '#f8f8f8' }, scroller: { enabled: true, pannable: true } }, nodeShape: 'rect', nodeX: 100, nodeY: 100, nodeWidth: 80, nodeHeight: 40 } } } </script> ``` 在上面的代码中,创建了一个Graph组件和一个Node组件。Graph组件定义了整个绘图区域的配置,例如大小、网格和背景颜色等。Node组件定义了一个矩形节点的形状、位置和尺寸。 通过设置Node组件的属性,可以绘制更多的节点,并使用适当的形状、位置和尺寸。 以上是一个简单的示例,展示了如何在Vue 2项目中使用AntV X6绘制树形流程图。通过修改组件属性,可以创建更复杂的图表,并通过AntV X6的其他功能来增强图表的交互性和可视化效果。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值