AntV_G6实现UI树

UI 树的实现

背景

目前需要实现一个 UI 树,用于展示设备树,以及设备树中设备的属性。与树状列表不同,UI 树需要有特定的交互方式,支持边以及当前节点的点击事件。

实现效果【复制到.html文件夹就看见了】

总体效果

点击节点效果

点击边效果


代码示例

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>G6 Tree Example</title>
  <script src="https://gw.alipayobjects.com/os/lib/antv/g6/4.3.11/dist/g6.min.js"></script>
  <style>
    #container {
      width: 100%;
      height: 100vh;
      border: 1px solid #eee;
    }
  </style>
</head>
<body>
  <div id="container"></div>

  <script>
    // 树结构数据
    const treeData = {
      id: 'root',
      label: 'CEO',
      children: [
        {
          id: 'tech',
          label: 'CTO',
          type: 'modelRect',
          description: '技术负责人',
          children: [
            { id: 'frontend', label: 'Frontend' },
            { id: 'backend', label: 'Backend' }
          ]
        },
        {
          id: 'finance',
          label: 'CFO',
          children: [
            { id: 'accounting', label: 'Accounting' },
            { id: 'investment', label: 'Investment' }
          ]
        }
      ]
    };

    // 创建 TreeGraph 实例
    const tree = new G6.TreeGraph({
      container: 'container',
      fitView: true,
      modes: {
        default: ['drag-canvas', 'zoom-canvas'],
        edit: ['click-select-node', 'click-select-edge', 'drag-node', 'drag-canvas', 'zoom-canvas']
      },
      defaultNode: {
        type: 'modelRect',
        size: [200, 80],
        style: {
          fill: '#fff',
          stroke: '#1890ff',
          radius: 4
        },
        labelCfg: {
          style: {
            fill: '#333',
            fontSize: 14
          }
        }
      },
      defaultEdge: {
        type: 'cubic-horizontal',
        style: {
          stroke: '#999',
          lineWidth: 2,
          endArrow: false,
        }
      },
      layout: {
        type: 'compactBox',
        direction: 'TB', // 树方向:Top-Bottom
        getHeight: () => 40,
        getWidth: () => 120,
        getVGap: () => 40,
        getHGap: () => 100
      }
    });

    // 绑定交互事件
    tree.on('node:click', e => {
      const node = e.item;
      console.log('节点点击:', node.getModel().label);
      // 添加点击效果
      node.update({
        style: {
          fill: '#e6f7ff',
          stroke: '#1890ff'
        }
      });
    });

    tree.on('edge:click', e => {
      const edge = e.item;
      console.log('连线点击:', edge.getSource().getModel().label,
                '->', edge.getTarget().getModel().label);
      // 添加点击效果
      edge.update({
        style: {
          stroke: '#ff4d4f',
          lineWidth: 3
        }
      });
    });

    // 渲染树
    tree.data(treeData);
    tree.render();

    // 适配画布尺寸
    window.onresize = () => {
      if (!tree || tree.get('destroyed')) return;
      tree.changeSize(window.innerWidth, window.innerHeight);
      tree.fitView();
    };
  </script>
</body>
</html>

实现方式

在网上进行了一波搜索,一开始我打算使用原生的 canvas 或者 svg 实现此类效果,但是发现实现起来比较麻烦,而且效果也不够好。后来我找到了一个开源的库,AntV G6 这个库可以很方便的实现树状图,而且效果很好,于是我决定使用这个库来实现 UI 树。

一. 安装 G6 库

npm install --save @antv/g6
import G6 from '@antv/g6';

或者像我一样使用 CDN 导入

// version <= 3.2
<script src="https://gw.alipayobjects.com/os/antv/pkg/_antv.g6-{$version}/build/g6.js"></script>

// version >= 3.3
<script src="https://gw.alipayobjects.com/os/lib/antv/g6/{$version}/dist/g6.min.js"></script>

// version >= 4.0
<script src="https://gw.alipayobjects.com/os/lib/antv/g6/4.3.11/dist/g6.min.js"></script>

二. 创建树图实例

// 创建 TreeGraph 实例
const tree = new G6.TreeGraph({
  container: "container",
  fitView: true,
  modes: {
    default: ["drag-canvas", "zoom-canvas"],
    edit: [
      "click-select-node",
      "click-select-edge",
      "drag-node",
      "drag-canvas",
      "zoom-canvas",
    ],
  },
  defaultNode: {
    // 配置节点的相关内容
    type: "modelRect",
    // 配置节点的大小
    size: [200, 80],
    // 配置节点的样式
    style: {
      fill: "#fff",
      stroke: "#1890ff",
      radius: 4,
    },
    // 配置节点的文本样式
    labelCfg: {
      style: {
        fill: "#333",
        fontSize: 14,
      },
    },
  },
  defaultEdge: {
    // 配置边的相关内容

    // 线条样式
    type: "cubic-horizontal",
    style: {
      stroke: "#999",
      lineWidth: 2,
      // 设置箭头样式,我这里不设置结尾箭头
      endArrow: false,
    },
  },
  layout: {
    // 配置布局相关内容,部分配置项树形UI特有的,需要在此进行配置
    type: "compactBox",
    direction: "TB", // 树方向:Top-Bottom
    // 在特定的树下的API,为高、宽、水平距离、垂直距离
    getHeight: () => 40,
    getWidth: () => 120,
    getVGap: () => 40,
    getHGap: () => 100,
  },
});

三. 绑定交互事件

// 绑定交互事件

// 节点点击事件
tree.on("node:click", (e) => {
  const node = e.item;
  console.log("节点点击:", node.getModel().label);
  // 添加点击效果
  node.update({
    style: {
      fill: "#e6f7ff",
      stroke: "#1890ff",
    },
  });
});
// 边点击事件
tree.on("edge:click", (e) => {
  const edge = e.item;
  console.log(
    "连线点击:",
    edge.getSource().getModel().label,
    "->",
    edge.getTarget().getModel().label
  );
  // 添加点击效果
  edge.update({
    style: {
      stroke: "#ff4d4f",
      lineWidth: 3,
    },
  });
});

四. 加载数据并渲染
数据格式:

const treeData = {
  id: "root",
  label: "CEO",
  children: [
    {
      id: "tech",
      label: "CTO",
      type: "modelRect",
      description: "技术负责人",
      children: [
        { id: "frontend", label: "Frontend" },
        { id: "backend", label: "Backend" },
      ],
    },
    {
      id: "finance",
      label: "CFO",
      children: [
        { id: "accounting", label: "Accounting" },
        { id: "investment", label: "Investment" },
      ],
    },
  ],
};

注意:在节点里面也是可以进行配置对应的属性的,比如:label、type、description等,这样在渲染的时候就会显示出来。


渲染

// 加载数据
tree.data(treeData);
// 渲染树图
tree.render();

五. 总结
以上就是实现树形图的基本步骤,如果需要更详细的配置,可以开头所贴的对应的API。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/984646.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何用Kimi生成PPT?秒出PPT更高效!

做PPT是不是总是让你头疼&#xff1f;&#x1f629; 快速制作出专业的PPT&#xff0c;今天我们要推荐两款超级好用的AI工具——Kimi 和 秒出PPT&#xff01;我们来看看哪一款更适合你吧&#xff01;&#x1f680; &#x1f947; Kimi&#xff1a;让PPT制作更轻松 Kimi的生成效…

深入理解Java中的static关键字及其内存原理

static是Java中实现类级共享资源的核心修饰符&#xff0c;它突破了对象实例化的限制&#xff0c;使得变量和方法能够直接与类本身绑定。这种特性让static成为构建工具类、全局配置等场景的利器&#xff0c;但同时也带来独特的内存管理机制需要开发者关注。 static修饰成员变量…

Zemax 中的 CAD 文件性能比较

这些文件格式 STEP、IGS、SAT 和 STL 通常用于 3D 建模、CAD 和工程应用程序。STEP、IGS、SAT 和 STL 之间的主要区别在于它们如何在 CAD、工程和 3D 打印应用程序中存储和表示 3D 几何图形。 Zemax OpticStudio、STEP、IGES、SAT 和 STL 文件的性能可能会因文件类型和用例&am…

springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38816)

一定要看到最后&#xff01; 一定要看到最后&#xff01; 一定要看到最后&#xff01; 一、漏洞描述 Spring框架是 Java 平台的一个开源的全栈应用程序框架和控制反转容器实现。2024年9月&#xff0c;Spring官方发布公告披露 CVE-2024-38816 Spring Framework 特定条件下目…

electron builder打包时,出现errorOut=ERROR: Cannot create symbolic link

解决办法&#xff1a; 以管理员身份运行PowerShell&#xff0c;然后进入到该目录下重新执行该指令。然后就会看到打包成功。 只要首次在PowerShell中链接创建完成&#xff0c;后续在VSCode或者CMD这些运行指令&#xff0c;都不会报错了

Tomcat下载安装及日志乱码问题解决

目录 tomcat下载安装 打开官网&#xff0c;选择想安装的版本 根据自己的电脑配置进行选择 tomcat安装 tomcat启动 启动窗口中文乱码问题 将tomcat日志配置改为GBK编码 修改系统区域设置 tomcat下载安装 访问tomcat官网&#xff1a;Apache Tomcat - Welcome! 打开官网&…

【贪心算法】简介

1.贪心算法 贪心策略&#xff1a;解决问题的策略&#xff0c;局部最优----》全局最优 &#xff08;1&#xff09;把解决问题的过程分成若干步 &#xff08;2&#xff09;解决每一步的时候&#xff0c;都选择当前看起来的“最优”的算法 &#xff08;3&#xff09;“希望”得…

J6打卡——pytorch实现ResNeXt-50实现猴痘检测

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 1.检查GPU import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, d…

javaEE初阶————多线程进阶(2)

今天来继续带大家学习多线程进阶部分啦&#xff0c;今天是最后一期啦&#xff0c;下期带大家做一些多线程的题&#xff0c;我们就可以开始下一个环节啦&#xff1b; 1&#xff0c;JUC&#xff08;java.util.concurrent&#xff09;的常见类 1&#xff09;Callable 接口 我们之…

初次体验Tauri和Sycamore(3)通道实现

​ 原创作者&#xff1a;庄晓立&#xff08;LIIGO&#xff09; 原创时间&#xff1a;2025年03月10日&#xff08;发布时间&#xff09; 原创链接&#xff1a;https://blog.csdn.net/liigo/article/details/146159327 版权所有&#xff0c;转载请注明出处。 20250310 LIIGO备注&…

【2025力扣打卡系列】0-1背包 完全背包

坚持按题型打卡&刷&梳理力扣算法题系列&#xff0c;语言为python3&#xff0c;Day5 0-1背包【目标和】 有n个物品&#xff0c;第i个物品的体积为w[i], 价值为v[i]。每个物品至多选一个&#xff0c;求体积和不超过capacity时的最大价值和常见变形 至多装capacity&#x…

windows下使用msys2编译ffmpeg

三种方法&#xff1a; 1、在msys2中使用gcc编译 2、在msys2中使用visual studio编译&#xff08;有环境变量&#xff09; 3、在msys2中使用visual studio编译&#xff08;无环境变量&#xff09; 我的环境&#xff1a; 1、msys2-x86_64-20250221 2、vs2015 3、ffmpeg-7.1…

引领变革!北京爱悦诗科技有限公司荣获“GAS消费电子科创奖-产品创新奖”!

在2025年“GAS消费电子科创奖”评选中&#xff0c;北京爱悦诗科技有限公司提交的“aigo爱国者GS06”&#xff0c;在技术创新性、设计创新性、工艺创新性、智能化创新性及原创性五大维度均获得评委的高度认可&#xff0c;荣获“产品创新奖”。 这一奖项不仅是对爱悦诗在消费电子…

cesium地图设置3d,2d,2.5d动态切换

通过修改cesium实例vw的scene的显示模式&#xff0c;来切换最终的显示模式。 Cesium.SceneMode总共有四个变量值&#xff0c;分别如下&#xff1a;NameTypeDescriptionMORPHINGnumber在3d与2d之间切换变体 between mode, e.g., 3D to 2D.COLUMBUS_VIEWnumber2.5d模式&#xff0…

Spring Boot 解析 LocalDateTime 失败?Uniapp 传输时间变 1970 的原因与解决方案

目录 前言1. 问题分析2. 时间戳&#xff08;推荐&#xff0c;可尝试&#xff09;3. 使用 JsonDeserialize & JsonSerialize&#xff08;中立&#xff09;4. 前端传 ISO-8601 格式&#xff08;不推荐&#xff0c;可尝试&#xff09;5. 用 String&#xff08;中立&#xff09…

基于Spark的热门动漫推荐数据分析与可视化系统的设计与实现(采用Python语言Django框架,Hadoop,spider爬虫等技术实现)

基于Hadoop的热门动漫推荐数据分析与可视化系统 基于Django的热门动漫推荐数据分析与可视化系统 1. 开发工具和实现技术 Pycharm, Python3.7&#xff0c;Django框架&#xff0c;Hadoop&#xff0c;Spark&#xff0c;Hive&#xff0c;spider爬虫&#xff08;爬取动漫之家的动…

【Java学习】泛型

面向对象系列八 一、泛型类变量 二、泛型实现 1.编译检查 2.类型擦除 3.泛型效果 三、类型检查 1.向上转型相关&#xff1a; 2.数组相关&#xff1a; 四、extend 1.非泛型下&#xff1a; 2.泛型中&#xff1a; 一、泛型类变量 一个类变量对里面位置引用变量的类型通泛…

nnMamba:基于状态空间模型的3D生物医学图像分割、分类和地标检测

摘要 本文提出了一种基于状态空间模型&#xff08;SSMs&#xff09;的创新架构——nnMamba&#xff0c;用于解决3D生物医学图像分割、分类及地标检测任务中的长距离依赖建模难题。nnMamba结合了卷积神经网络&#xff08;CNN&#xff09;的局部特征提取能力与SSMs的全局上下文建…

探索在生成扩散模型中基于RAG增强生成的实现与未来

概述 像 Stable Diffusion、Flux 这样的生成扩散模型&#xff0c;以及 Hunyuan 等视频模型&#xff0c;都依赖于在单一、资源密集型的训练过程中通过固定数据集获取的知识。任何在训练之后引入的概念——被称为 知识截止——除非通过 微调 或外部适应技术&#xff08;如 低秩适…

OpenAI API模型ChatGPT各模型功能对比,o1、o1Pro、GPT-4o、GPT-4.5调用次数限制附ChatGPT订阅教程

本文包含OpenAI API模型对比页面以及ChatGPT各模型功能对比表 - 截至2025最新整理数据&#xff1a;包含模型分类及描述&#xff1b;调用次数限制&#xff1b; 包含模型的类型有&#xff1a; Chat 模型&#xff08;如 GPT-4o、GPT-4.5、GPT-4&#xff09;专注于对话&#xff0c…