vue项目树状图的实现

2023-11-03

1.实现背景

项目需要直观的展示元素之间的关系,需要实现一个树状图

数据可视化可以用Echarts HighCharts,但是相关树状图的示例不够直观,且不美观

几种工具之间比较,选择了蚂蚁金服的G6来实现(在开发期间有树状图的示例,之后再看发现这个例子没有了)

2.相关技术介绍

G6图可视化引擎(蚂蚁数据可视化 G6)

G6 是一个图可视化引擎。它提供了图的绘制、布局、分析、交互、动画等图可视化的基础能力。旨在让关系变得透明,简单。让用户获得关系数据的 Insight。

3.项目集成

3.1树状图渲染公共方法

因为页面有多处用到了树状图的逻辑,所以将方法封装成了公共的方法

文件路径 /src/utils/treeNode.js

3.1.2handleTree 处理渲染数据

主要用于将后端返回的数据处理为可以成功渲染树状图的数据格式

具体逻辑解释见代码中注释

export function handleTree(data,currentComponent){
  // 判断数据类型 根节点只有一个,不是数组
  if(Array.isArray(data)){
    data.forEach(item => {
      // data是后端返回数据 处理为有 id label style键值的对象,主要根据这几个值渲染树状图
      item.id = item.component.componentCode;
      item.label = item.component.name;
      item.style = {fill:"#91d5ff",stroke: '#40a9ff',radius: 5};// 每个节点的背景色 边框颜色 矩形的圆角样式;可以根据具体的需求处理节点样式
      // 当前节点高亮,区分于其他节点
      if(item.component.componentCode == currentComponent){
        item.style = {fill:"#45b8ff",stroke: '#2aa0fb',radius: 5};
      }
      // 判断是否还有子节点
      if(item.children.length != 0 ){
        // 递归渲染子节点
        handleTree(item.children,currentComponent);
      }
    });
  }else{
    data.id = data.component.componentCode;
    data.label = data.component.name;
    data.style = {fill:"#91d5ff",stroke: '#40a9ff',radius: 5};
    if(data.component.componentCode == currentComponent){
      data.style = {fill:"#45b8ff",stroke: '#2aa0fb',radius: 5};
    }
    if(data.children.length !=0 ){
      handleTree(data.children,currentComponent);
    }
  }
}

3.1.3renderTreeNode 处理渲染视图

export function renderTreeNode(data,currentComponent) {
  // 渲染树状图方法
  G6.Util.traverseTree(data)

  // 树状图线的样式
  G6.registerEdge('flow-line', {
    draw(cfg, group) {
      const startPoint = cfg.startPoint;
      const endPoint = cfg.endPoint;
      const { style } = cfg
      const shape = group.addShape('path', {
        attrs: {
          stroke: style.stroke,
          endArrow: style.endArrow,
          path: [
            ['M', startPoint.x, startPoint.y],
            ['L', startPoint.x, (startPoint.y + endPoint.y) / 2],
            ['L', endPoint.x, (startPoint.y + endPoint.y) / 2,],
            ['L', endPoint.x, endPoint.y],
          ],
        },
      });
      return shape;
    }
  });

  // 定义节点样式
  const defaultNodeStyle = {
    stroke: '#40a9ff',
    radius: 5
  }
  // 定义线的样式
  const defaultEdgeStyle = {
    stroke: '#91d5ff',
    endArrow: {
      path: 'M 0,0 L 12, 6 L 9,0 L 12, -6 Z',
      fill: '#91d5ff',
      d: -20
    }
  }
  // 基本布局
  const defaultLayout = {
    type: 'compactBox',
    direction: 'TB',
    getId: function getId(d) {
      return d.id;
    },
    getHeight: function getHeight() {
      return 16;
    },
    getWidth: function getWidth() {
      return 16;
    },
    getVGap: function getVGap() {
      return 40;
    },
    getHGap: function getHGap() {
      return 70;
    },
  }
  // 定义文本样式
  const defaultLabelCfg = { // label显示
    style: {
      fontSize: 12,
    }
  }
  const graph = new G6.TreeGraph({
    container: 'container', // 页面树状图渲染容器
    width:500,
    height:400,
    linkCenter: true,
    defaultNode: { // 节点样式
      size: [120, 30],
      shape:"rect",
      style: defaultNodeStyle,// 节点样式
      labelCfg: defaultLabelCfg// 文本样式
    },
    defaultEdge: { // 线的样式
      type: 'flow-line',
      style: defaultEdgeStyle,
    },
    layout: defaultLayout
  });
  graph.data(data);
  graph.render();
  graph.fitView();
}

3.2页面树状图容器

<div id="container"></div><div id="container"></div>

3.3在合适的时机调用方法

getTree(componentCode) {
  // 传入的componentCode主要用来区分当前节点
  handleTree(this.treeData,componentCode);
  renderTreeNode(this.treeData,componentCode);
}

3.4注意点

项目中可以显示列表数据中每一条对应的树状图,所以存在树状图的切换;

注意要把容器内之前渲染的数据清除,重新渲染新的数据;否则会显示多个树状图

if (document.getElementById("container")) {
  document.getElementById("container").innerHTML = "";
}

3.5树状图效果图

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue项目树状图的实现 的相关文章

随机推荐

  • 前端小白HTML——1.html基础

    HTML语言的基本规则 1 1 HTML基本结构 内是头部信息 不显示在网页上 内是网页内容
  • vs2019断点调试设置断点条件

    系列文章目录 文章目录 系列文章目录 前言 一 使用条件断点 二 使用步骤 1 示例代码 前言 使用vs2019调试代码时 如果遇到for while do while逊汗语句时 而且循环次数很多时 改怎么办呢 一 使用条件断点 二 使用步
  • Ubuntu18.04使用阿里源镜像安装Docker并配置镜像加速【图文详细】

    官方安装文档 https docs docker com engine install ubuntu 阿里源安装文档 推荐 https developer aliyun com mirror docker ce spm a2c6h 1365
  • Unable to build Cython components. Please make sure Cython is installed if the torch.hub

    在我使用torch hub的时候报了如下一个错误 解决方法 参考 https github com h5py h5py issues 535 先安装 h5py 再安装 Cython pip install h5py pip install
  • 概率论中高斯分布(正态分布)介绍及C++11中std::normal_distribution的使用

    高斯分布 最常用的分布是正态分布 normal distribution 也称为高斯分布 Gaussian distribution 正态分布N x 2 呈现经典的 钟形曲线 的形状 其中中心峰的x坐标由 给出 峰的宽度受 控制 正态分布由
  • c++ 提取字符串前面数字stoi和atoi

    stoi和atoi 包含在 include lt cstdlib gt 作用是将字符串转化为int型 区别是stoi的形参是string 而atoi的形参是char 注 只是将字符串前面是数字的部分提取出来 代码可以看这篇文章 https
  • ChatGPT无限卡Cloudflare 验证你是真人

    问题 我的情况是这样 在Chrome里 打开chatGPT的网页 会无限验证你是真人 打开无痕浏览页面可以正常登录 2023 04 20 更新 新的解决方案 github上有一个油猴脚本 KeepChatGPT 可以解决这个问题 至少目前我
  • 02Tcpdump命令详解-网络抓包工具

    1 概述 今天我们要介绍的是一款网络抓包工具tcpdump 重点讨论并介绍一些有用的命令及最佳实践 tcpdump是一个功能最强大 应用最广泛的命令行数据包嗅探器或包分析工具 用于抓取或过滤制定接口接受或发送的TCP IP数据包 tcmpd
  • 42-Docker-Docker命令详解-docker build

    Docker命令详解 docker build 前言 docker build 原理 语法格式 options说明 使用示例 前言 本篇来学习下制作docker镜像的命令 docker build docker build 原理 docke
  • 环境文件复制

    1 yaml复制 package com ybw yaml demo generate import com alibaba fastjson2 JSON import lombok extern slf4j Slf4j import or
  • linux android studio 快捷方式,Android Studio 使用小技巧和快捷键

    Android Studio 使用小技巧和快捷键 Published by xiaosixi on 2016年12月19日 1 书签 Bookmarks 描述 这是一个很有用的功能 让你可以在某处做个标记 书签 方便后面再跳转到此处 调用
  • 【论文速览】ICLR23 - 将图像视为一组点集 Image as Set of Points

    文章目录 研究背景 解决思路 部分实验效果 思考 参考资料 收录于ICLR2023 oral notable top 5 代码地址 https github com ma xu Context Cluster 研究背景 目前计算机视觉领域最
  • 循环代码模型构建方法

    循环结构是源代码程序的重要结构 然而即使是简单的循环程序 也很容易出错 循环中的很多错误往往需要执行多次或者在某些特定的情况下才能被发现 检测这些错误的代价很高 所以需要重点开展对软件循环代码的安全性分析研究 而对循环代码结构进行研究的重要
  • 2018年Android面试题含答案--适合中高级

    1 java中 和equals和hashCode的区别 基本数据类型的 比较的值相等 类的 比较的内存的地址 即是否是同一个对象 在不覆盖equals的情况下 同比较内存地址 原实现也为 如String等重写了equals方法 hashCo
  • 如何学会读论文?送你滑铁卢大学S. Keshav的三轮阅读法

    来源 专知 本文约3100字 建议阅读6分钟 本文为你介绍三轮阅读法 教你如何高效读论文 导读 读论文是从事科学研究与工程等必不可少环节 但是如何高效读论文却有一番讲究 滑铁卢大学S Keshav 撰写了 How to Read a Pap
  • 80 后女程序员拒当「码农」:“转行小说家后,我用 AI 写了 16 本书!”

    省时查报告 专业 及时 全面的行研报告库 省时查方案 专业 及时 全面的营销策划方案库 免费下载 2023年8月份全网热门报告合集 ChatGPT提词示例 让你的ChatGPT聪明100倍 超百页干货资料 AI应用的难点 痛点与未来 202
  • 终止关闭服务端口号 8080为例

    Identify and stop the process that s listening on port 8080 or configure thi 当我们遇到服务器端口号被占用的时候 下一个服务器就带不开了 让人很是烦躁 下面猿猿总结
  • 【华为OD机试真题 python】事件推送【2022 Q4

    题目描述 事件推送 同一个数轴X上有两个点的集合A A1 A2 Am 和B B1 B2 Bn Ai和Bj均为正整数 A B已经按照从小到大排好序 A B均不为空 给定一个距离R 正整数 列出同时满足如下条件的所有 Ai Bj 数对 1 Ai
  • oracle单实例客户端连接的failover功能

    今天测试了一下单实例数据库客户端连接的failover功能 操作系统为red hat 5 5 root localhost cat etc issue Red Hat Enterprise Linux Server release 5 5
  • vue项目树状图的实现

    1 实现背景 项目需要直观的展示元素之间的关系 需要实现一个树状图 数据可视化可以用Echarts HighCharts 但是相关树状图的示例不够直观 且不美观 几种工具之间比较 选择了蚂蚁金服的G6来实现 在开发期间有树状图的示例 之后再