React项目实战:用AntV G6打造可折叠组织架构图(附完整代码)

vue antvG6 绘制组织架构图 效果展示 antvg6组织架构图 准备工作 如果你已经安装步骤完成相关安装,可直接创建页面复制代码 也可可直接下载我的demo demo地址:vue-antvg6地址 vue-antvg6简易包 git clone https://gitee.com/shuaizi010/vue-antvg6.git cd 项目目录 npm install 详细介绍 我是用panjiachen的vue-admin-tempalte,来做例子的框架,在上面做示例页面 1 安装vue-admin-template git 阅读详情

React项目实战:用AntV G6打造可折叠组织架构图(附完整代码)

在构建现代企业级后台管理系统时,数据可视化往往是提升管理效率和决策直观性的关键一环。想象一下,当你需要向管理层清晰展示一个拥有数百个节点、层级复杂的组织架构,或者梳理一个大型项目的任务依赖关系时,静态的列表或树形控件就显得力不从心了。这时,一个支持动态交互、可自由缩放与折叠的可视化图表,不仅能清晰呈现全局结构,还能让用户通过点击探索细节,体验上有着质的飞跃。

这正是AntV G6这类专业图可视化引擎的用武之地。它并非一个简单的图表库,而是一个为复杂关系网络和层级结构量身定制的解决方案。结合React的组件化思想,我们可以将复杂的图可视化逻辑封装成清晰、可复用的业务组件,无缝集成到现有的技术栈中。本文将带你超越基础的“Hello World”示例,深入探讨如何在React项目中,利用G6实现一个功能完备、性能优良且具备良好交互体验的可折叠组织架构图。我们会从项目搭建开始,逐步深入到自定义节点、交互逻辑、状态管理以及性能优化等实战层面,并提供可直接用于生产环境的代码模块。

1. 项目环境搭建与核心依赖

在开始编码之前,确保你的开发环境已经就绪。我们假设你已有一个基于Create React App或Vite创建的React项目。如果没有,可以使用以下命令快速初始化一个:

# 使用 Vite (推荐,速度更快)
npm create vite@latest my-g6-project -- --template react
cd my-g6-project
npm install

# 或使用 Create React App
npx create-react-app my-g6-project
cd my-g6-project

接下来,安装本文所需的核心依赖。除了AntV G6本身,我们还会引入一些辅助库来提升开发体验。

npm install @antv/g6
npm install --save-dev @types/antv__g6 # 如果你使用TypeScript

注意:AntV G6的API和功能迭代较快,建议在安装前查阅其官方文档以确认最新版本和兼容性。本文示例基于G6 4.x版本。

一个清晰的项目结构有助于长期维护。建议为G6相关的组件和工具创建独立的目录:

src/
├── components/
│   ├── OrgChart/           # 组织架构图主组件
│   │   ├── index.tsx
│   │   ├── OrgChart.tsx
│   │   ├── customNode.ts   # 自定义节点定义
│   │   └── types.ts        # TypeScript类型定义
│   └── ...
├── hooks/                  # 自定义Hook,如图表实例管理
│   └── useG6Graph.ts
├── utils/                 # 数据处理工具函数
│   └── dataTransform.ts
└── App.tsx

2. 数据建模与G6图实例初始化

可视化始于数据。一个典型的组织架构数据是嵌套的树形结构。我们首先定义其TypeScript接口,并准备一份模拟数据。

1. 定义数据结构 在 types.ts 中,我们明确节点的结构:

export interface OrgNode {
  id: string;          // 唯一标识
  label: string;       // 显示名称
  name?: string;       // 真实姓名
  title?: string;      // 职位
  department?: string; // 部门
  avatar?: string;     // 头像URL
  children?: OrgNode[]; // 子节点
  collapsed?: boolean;  // 是否已折叠(用于内部状态管理)
}

export type OrgChartData = OrgNode;

2. 准备模拟数据 在组件内部或单独的数据文件中,构造一份具有多层嵌套的模拟数据:

const mockData: OrgNode = {
  id: 'root',
  label: '首席执行官 (CEO)',
  name: '张伟',
  title: 'CEO',
  children: [
    {
      id: 'tech',
      label: '技术部',
      department: 'CTO Office',
      children: [
        { id: 'fe', label: '前端组', name: '李静', title: '前端负责人' },
        { 
          id: 'be', 
          label: '后端组', 
          name: '王强', 
          title: '后端架构师',
          children: [
            { id: 'be-java', label: 'Java服务', name: '赵明' },
            { id: 'be-go', label: 'Go服务', name: '孙丽' }
          ]
        },
        { id: 'qa', label: '测试组', name: '周涛', title: 'QA经理' }
      ]
    },
    {
      id: 'product',
      label: '产品部',
      name: '陈曦',
      title: '产品总监',
      children: [
        { id: 'pm', label: '产品经理组', name: '吴浩' },
        { id: 'design', label: '设计组', name: '郑爽' }
      ]
    }
    // ... 更多部门
  ]
};

3. 初始化G6图实例 这是最核心的一步。我们在React组件的 useEffect 钩子中创建并配置G6实例。关键点在于理解各项配置的作用。

import React, { useEffect, useRef } from 'react';
import G6 from '@antv/g6';

const OrgChart = ({ data }) => {
  const containerRef = useRef(null);
  const graphRef = useRef(null);

  useEffect(() => {
    if (!containerRef.current || graphRef.current) return;

    const container = containerRef.current;
    const width = container.scrollWidth;
    const height = container.scrollHeight || 600;

    // 1. 注册自定义节点和边(下一节详述)
    registerCustomNode();
    registerCustomEdge();

    // 2. 创建图实例
    const graph = new G6.TreeGraph({
      container: container,
      width,
      height,
      linkCenter: true, // 连线对准节点中心
      modes: {
        default: [
          'drag-canvas',   // 拖拽画布
          'zoom-canvas',   // 缩放画布
          'drag-node',     // 拖拽节点
          {
            type: 'tooltip', // 鼠标悬停提示
            formatText: (model) => {
              return `姓名: ${model.name || 'N/A'}\n职位: ${model.title || model.label}`;
            },
          }
        ],
      },
      defaultNode: {
        type: 'org-node', // 使用我们即将注册的自定义节点类型
        size: [180, 80],  // 节点默认大小
      },
      defaultEdge: {
        type: 'org-edge', // 自定义边类型
        style: {
          stroke: '#A3B1BF',
          lineWidth: 1.5,
        },
      },
      layout: {
        type: 'compactBox', // 紧凑树布局
        direction: 'TB',     // 从上到下 (Top to Bottom)
        getHeight: () => 40,
        getWidth: () => 16,
        getVGap: () => 50,   // 垂直间距
        getHGap: () => 100,  // 水平间距
        radial: false,       // 非辐射状
      },
      fitView: true,         // 初始化时自适应视图
      animate: true,         // 启用布局动画
    });

    graphRef.current = graph;

    // 3. 读取数据并渲染
    graph.data(data
AntV G6自定义节点与交互实战:手把手教你打造可折叠的脑图组件 本文详细介绍了如何使用AntV G6图可视化引擎构建可折叠的脑图组件,涵盖自定义节点注册、交互逻辑实现、动态布局优化等核心环节。通过实战代码演示,帮助开发者掌握G6的高级特性,打造支持折叠展开、右键菜单、快捷键操作等功能的专业级脑图应用,提升数据可视化项目的交互体验。 阅读详情

相关推荐

antv x6使用(思维导图、鱼骨图、节点排序、新增节点、编辑节点、删除节点、选中节点)

文章主要记录了antv x6的基本使用,思维导图、鱼骨图、组织结构图、树形图的绘制方法

mfxcyh的博客 2067

别再手动画图了!用AntV G6 3分钟搞定前端关系图(附完整代码)

本文介绍了如何使用AntV G6图可视化引擎快速构建专业级前端关系图,告别传统手绘方式。通过完整代码示例,展示了G6的动态数据绑定、自动布局算法和丰富交互功能,帮助开发者高效实现电商推荐、IT运维等复杂场景的可视化需求。

weixin_27603469的博客 241

保姆级教程:用AntV G6 4.x打造可交互的组织架构图(含节点分侧布局与Tooltip技巧)

本文提供了一份详细的AntV G6 4.x教程,指导开发者如何构建可交互的组织架构图,重点介绍了节点分侧布局和Tooltip技巧。通过环境搭建、数据结构配置、高级视觉定制和性能优化等步骤,帮助新手快速掌握AntV G6的核心功能,提升企业管理和团队协作效率。

weixin_30781107的博客 280

微信开放标签wx-open-launch-app样式失效?手把手教你正确设置点击区域(附完整代码)

本文详细解析了微信开放标签`wx-open-launch-app`样式失效和点击无响应的常见问题,提供了完整的解决方案和代码示例。通过分析标签内部实现机制,指导开发者正确设置点击区域和样式,确保跨平台兼容性和用户体验优化。

joy55的博客 320

千兆网口电路设计中的EMC防护与TVS选型实战

本文深入探讨了千兆网口电路设计中面临的EMC挑战,并提供了TVS二极管选型的实战指南。文章分析了ESD、浪涌和EFT等主要威胁,重点阐述了如何根据工作电压、钳位电压和关键的低结电容等参数为PHY芯片选择匹配的TVS器件,以确保在严苛电磁环境下实现可靠的信号完整性与防护。

m3n5b7v8c9x的博客 531

合金理论自动化工具包(Alloy-Theoretic Automated Toolkit:ATAT)的安装

合金理论自动化工具包(ATAT)是一个通用名称,指的是合金理论工具的集合,它包含了不同的代码工具,具体如下: 1)根据第一性原理(映射和映射)构造集群扩展的代码。簇展开是一种非常紧凑和有效的表达式,给出取代合金的能量作为其构型的函数(即原子的类型位于晶格的哪个位置)。 2)为了计算合金的热力学性质,从聚类展开开始,对晶格模型进行蒙特卡洛模拟(emc2和memc2)的代码。 3)执行晶格动力学计算的代码(fitfc, fitsvsl, svsl) 4)使用简单的物理或半经验模型计算电子和磁自由能贡献

qq_33400046的博客 1万+

保姆级教程:用Labelme标注车辆关键点,并一键转成YOLOv8-pose训练格式

本文提供了一份详细的车辆底盘关键点标注教程,从使用Labelme进行标注到一键转换为YOLOv8-pose训练格式的全流程指南。特别针对工业检测和自动驾驶场景,分享了标注规范、格式转换脚本及常见问题解决方案,帮助开发者高效准备训练数据并优化模型性能。

weixin_27419879的博客 309

MIPI CSI-2 协议解析

CSI-2标准协议前言一、Overview of CSI-2二、CSI-2 layer Definitions三、 Camera Control Interface(CCI)3.1 数据传输协议(Data Transfer Protocol)3.1.1 消息类型(Message Type)3.1.2 读写操作(Read/Write Operations)3.1.2.1 随机位置单次读3.1.2.2 当前位置单次读3.1.2.3 随机位置连续读3.1.2.4 当前位置连续读3.1.2.5 随机位置单次写3.1

Lucky 3万+

单晶塑性abaqus-umat自学

单晶塑性abaqus-umat 摘要1. 简介2. 单晶弹塑性本构模型回顾2.1运动学 本文以翻译黄永刚老师的umat文章为主,这个颜色的为个人的理解。 摘要 包含单晶塑性的abaqus用户材料子程序。本文回顾有限元形式的单晶弹塑性和黏弹塑性,包含小变形理论,以及严格的有限变形和有限旋转理论。单晶的非弹性变形由于晶体滑移,假定遵从Schmid准则。提出多种多样的分切应力与剪切变形的自硬化和潜硬化关系,并且包含在子程序内。 1. 简介   有限元程序ABAQUS已经广泛应用在固体的变形与应力分析。除了自身大量

Niklas4088的博客 1万+

WorkBuddy Skill赋能HYSYS与Comsol:AI工作台下的仿真自动化实践

AI Agent正将工业软件自动化带向新高度。在工程仿真领域,流程模拟与多物理场分析常因重复性操作而效率低下,Aspen HYSYS的批量工况调整、Comsol的参数扫描与网格重构均属此类。WorkBuddy这类AI工作台通过Skill将软件二次开发能力封装为可插拔技能包,利用HYSYS的COM/OLE接口和Comsol的Java API,实现自然语言指令到自动化执行的转变。其技术价值在于降低自动化门槛、沉淀工程经验,并支持日志审计与异常重试。在实际应用中,无论化工流程的灵敏度分析,还是激光焊接、移动网格等

weixin_29055699的博客 307

头歌OpenGauss数据库-G.视图的使用

OpenGauss数据库-G.视图的使用

python一生之敌的博客 1386

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: STM32步进电机控制:为什么TIM_CCxChannelCmd关不掉互补通道?实测解决方案
下一篇: Qt鼠标事件实战:5个常见交互场景的代码实现与避坑指南
devops8pract
博客等级 码龄4年 533粉丝 849原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值