antvG6绘制树形图踩坑记录(自定义节点等功能)

antvG6的基础使用方法以及制作树形图中的踩坑

一、树形图的生成

项目背景:用父子结构的树形图来展示交换机之间的关系并且处理相关业务逻辑

1.使用antvg6的树形图,首先到官网示例里找到一个和我们想要做的差不多的例子,在此基础上修改

官方教程
1先下载包

npm install --save @antv/g6

2然后导入

import G6 from '@antv/g6';

3创建一个视图容器

<div id="mountNode"></div>

4准备数据

const data = {
  // 点集
  nodes: [
    {
      id: 'node1', // String,该节点存在则必须,节点的唯一标识
      x: 100, // Number,可选,节点位置的 x 值
      y: 200, // Number,可选,节点位置的 y 值
    },
    {
      id: 'node2', // String,该节点存在则必须,节点的唯一标识
      x: 300, // Number,可选,节点位置的 x 值
      y: 200, // Number,可选,节点位置的 y 值
    },
  ],
  // 边集
  edges: [
    {
      source: 'node1', // String,必须,起始点 id
      target: 'node2', // String,必须,目标点 id
    },
  ],
};

5实例化创建关系图

const graph = new G6.Graph({
  container: 'mountNode', // String | HTMLElement,必须,在 Step 1 中创建的容器 id 或容器本身
  width: 800, // Number,必须,图的宽度
  height: 500, // Number,必须,图的高度
});

6配置数据源渲染

graph.data(data); // 读取 Step 2 中的数据源到图上
graph.render(); // 渲染图

最终效果
在这里插入图片描述
以上就是基本的使用

二、拓扑图项目中遇到的坑

#### 1、增加节点之后要把父节点以下的节点都展示出来
新建接口提交之后要把父节点以下的所有节点都请求回来并且插入到父节点以下,实现此时要重新渲染父节点以下的所有节点并且父节点以上的节点要递归进行修改计数的label
 //添加节点
        const item = graph.findById(node.pid)//获取父节点
        const model = item.getModel()//拿到父节点模型
        this.getChildNode(node.pid, model) //重新请求该节点以下所有子节点并渲染
        item.update(model) //此api是重点,更新当前节点以下的布局
        this.recursion(node.pid, { add: true }) //递归加一上边所有节点

methods:{
 /**
     * 请求子节点并添加到视图上
     * @param {*} id 当前点击节点的id
     * @param {*} model 当前节点详情
     */
    getChildNode(id, model) {
      this.loading = true
      topoTree({ id, maxLevel: 2 })
        .then(res => {
          if (res.code === 200) {
            let childrenList = res.data.children
            model.children = childrenList //插入子节点
            model.collapsed = false //展开节点
            graph.updateChild(model, model.id) //更新节点
          }
        })
        .finally(() => {
          this.loading = false
        })
    },
        /**
     * 递归让父节点加一或者减一
     * @param {*} pid 父节点id
     * @param {*} isAdd add:true递归加 add:false递归减
     */
    recursion(pid, isAdd) {
      const parentNode = graph.findById(pid)
      const { add } = isAdd
      add ? ++parentNode._cfg.model.childrenNum : --parentNode._cfg.model.childrenNum
      graph.refreshItem(parentNode) //更新节点
      const curPid = parentNode._cfg.model.pid
      if (curPid < -1) return
      this.recursion(curPid, isAdd)
    },
}

这里要查看文档中 的元素实例和方法

---------------------------------------------------------------分割线-----------------------------------------------------------

继续踩坑,新需求,如何让节点下边的label斜着展示

效果如下:
在这里插入图片描述
此事需要自定义节点 官方文档 你会发现,没TM的写详情
直接看我写的
首先要调用G6.registerNode配置draw这个函数

G6.registerNode(
 'flow-circle',
 {
/**绘制大圆点 */
 const circle = group.addShape('circle', {
   attrs: { 
     x: 0,
     y: 0
   },
   name: 'big-dot-shape'
 })
  /**节点lable */
   const text = group.addShape('text', {
     attrs: { 
       x: nodeOrigin.x - 20,
       y: nodeOrigin.y + 25,
       text: name ,
       fill: '#000', 
       textAlign: 'end',
     },
     name: 'lable-shape'
   }).translate(-10, 6)
 // 三个顶级节点的文字不用转角度
 if (cfg.id !== '-1') {
   text.rotate(-0.4) //逆时针旋转0.4
 }
 },
  'circle'
)

如果想更新节点,比如更改节点上的字或者改变节点上的元素,要自定义update函数,才行

update(cfg, node) {
    const { label, childrenNum, name } = cfg
    // 更新子节点数量
    const group = node.getContainer()
    const childNumShape = group.find(ele => ele.get('name') === 'childNum-shape')
    childNumShape.attrs.text = childrenNum

    // 更新所有的label
    const nameShape = group.find(ele => ele.get('name') === 'lable-shape')
    nameShape.attrs.text = name
    this.updateLinkPoints(cfg, group)
  },

如果想这只节点状态,也就是鼠标移入高亮,移出变暗效果就要自定义setState函数

setState(name, value, item) {
    const group = item.getContainer()
    const bigDotShap = group.find(e => e.get('name') === 'big-dot-shape')
    if (name === 'highlight') {
      bigDotShap.attr({
        stroke: 'rgba(95,149,255, 1)',
        fill: 'rgba(95,149,255, 1)'
      })
    } else if (name === 'dark') {
      bigDotShap.attr({
        stroke: 'rgba(255,117,0, 1)',
        fill: 'rgba(255,117,0, 0.9)'
      })
    }
  }
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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的其他功能来增强图表的交互性和可视化效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值