当前位置: 首页 > article >正文

Vue2项目实战:用AntV G6打造可折叠树形结构(附完整代码)

Vue2与AntV G6深度整合构建企业级可交互树形可视化方案在数据密集型的现代Web应用中树形结构可视化已成为组织架构展示、文件目录管理、决策流程分析等场景的核心需求。本文将基于Vue2框架与AntV G6可视化引擎从工程化角度完整呈现一个支持动态折叠展开、节点自定义渲染的企业级树形结构解决方案。1. 环境搭建与基础配置1.1 初始化Vue2项目首先确保已安装Node.js环境建议版本12通过Vue CLI创建项目npm install -g vue/cli vue create g6-tree-demo cd g6-tree-demo安装AntV G6核心库及扩展插件npm install antv/g6 antv/hierarchy --save1.2 基础组件结构创建TreeGraph.vue组件文件建立基础DOM结构和引入逻辑template div classtree-container div refgraphContainer :style{ height: containerHeight px }/div /div /template script import G6 from antv/g6 import { TreeGraph } from antv/g6 export default { name: TreeGraph, props: { treeData: { type: Object, required: true } }, data() { return { graph: null, containerHeight: 500 } }, mounted() { this.initGraph() } } /script2. 数据规范与预处理2.1 标准树形数据结构AntV G6要求的树形数据格式如下{ id: root, label: 根节点, children: [ { id: child1, label: 子节点1, children: [...] } ] }2.2 数据清洗策略实际业务数据往往需要转换处理推荐使用以下工具方法methods: { normalizeTreeData(rawData) { const processNode (node) { if (!node) return null return { id: node.id || Math.random().toString(36).substr(2, 9), label: node.name || node.title || 未命名节点, children: Array.isArray(node.children) ? node.children.map(processNode).filter(Boolean) : [], ...node // 保留原始属性 } } return processNode(rawData) } }3. 核心可视化实现3.1 图形实例化配置在initGraph方法中配置TreeGraph的核心参数initGraph() { this.graph new TreeGraph({ container: this.$refs.graphContainer, width: this.$el.clientWidth, height: this.containerHeight, modes: { default: [drag-node] }, defaultNode: { type: custom-node, size: [120, 40], style: { fill: #F6F9FE, stroke: #CED4DA } }, defaultEdge: { type: cubic-horizontal, style: { stroke: #ADB5BD, lineWidth: 2 } }, layout: { type: dendrogram, direction: TB, nodeSep: 50, rankSep: 100 } }) }3.2 自定义节点渲染实现带折叠控制的自定义节点G6.registerNode(custom-node, { draw(cfg, group) { const rect group.addShape(rect, { attrs: { x: 0, y: 0, width: cfg.size[0], height: cfg.size[1], radius: 4, fill: cfg.style.fill, stroke: cfg.style.stroke } }) // 节点文本 group.addShape(text, { attrs: { text: cfg.label, x: cfg.size[0] / 2, y: cfg.size[1] / 2, textAlign: center, textBaseline: middle, fill: #495057 } }) // 折叠控制按钮 if (cfg.children cfg.children.length 0) { const marker group.addShape(marker, { attrs: { x: cfg.size[0] - 15, y: cfg.size[1] / 2, r: 6, symbol: cfg.collapsed ? this.expandIcon : this.collapseIcon, stroke: #868E96 }, name: collapse-icon }) marker.on(click, evt { evt.stopPropagation() this.toggleCollapse(cfg.id) }) } return rect }, collapseIcon(x, y, r) { return [ [M, x - r, y], [L, x r, y], [M, x, y - r], [L, x, y r] ] }, expandIcon(x, y, r) { return [ [M, x - r, y], [L, x r, y] ] } }, single-shape)4. 高级功能实现4.1 动态折叠展开实现节点状态管理功能methods: { toggleCollapse(nodeId) { const node this.graph.findById(nodeId) const model node.getModel() this.graph.updateItem(node, { collapsed: !model.collapsed }) // 自动调整布局 setTimeout(() { this.graph.layout() this.graph.fitView() }, 100) } }4.2 响应式容器添加窗口大小变化的响应处理mounted() { this.initGraph() window.addEventListener(resize, this.handleResize) }, beforeDestroy() { window.removeEventListener(resize, this.handleResize) }, methods: { handleResize() { if (this.graph) { this.graph.changeSize( this.$el.clientWidth, this.containerHeight ) this.graph.fitView() } } }4.3 性能优化策略针对大型树结构的优化方案initGraph() { this.graph new TreeGraph({ // ...其他配置 renderer: svg, // 使用SVG渲染器 animate: false, // 关闭动画 groupByTypes: false }) // 启用虚拟渲染 this.graph.get(canvas).set(localRefresh, false) }5. 企业级应用实践5.1 复杂节点样式设计实现带状态标识的业务节点G6.registerNode(biz-node, { draw(cfg, group) { const baseRect group.addShape(rect, { attrs: { x: 0, y: 0, width: 160, height: 60, radius: 4, fill: this.getStatusColor(cfg.status), stroke: #DEE2E6 } }) // 状态标识 group.addShape(rect, { attrs: { x: 0, y: 0, width: 4, height: 60, fill: this.getStatusAccent(cfg.status) } }) // 主文本 group.addShape(text, { attrs: { text: cfg.label, x: 10, y: 20, textAlign: left, fill: #343A40, fontSize: 14 } }) // 副文本 group.addShape(text, { attrs: { text: cfg.desc || , x: 10, y: 40, textAlign: left, fill: #868E96, fontSize: 12 } }) }, getStatusColor(status) { const map { normal: #E6F7FF, warning: #FFF7E6, error: #FFF1F0 } return map[status] || #F8F9FA } })5.2 与Vue状态管理集成结合Vuex实现状态同步computed: { processedData() { return this.normalizeTreeData(this.$store.state.treeData) } }, watch: { processedData: { handler(newVal) { if (this.graph) { this.graph.changeData(newVal) } }, deep: true } }在项目实际落地过程中我们发现树形结构的性能瓶颈主要出现在节点数量超过500时。通过实现动态加载子节点的策略可以有效解决大规模数据渲染问题。具体实现时可以监听节点展开事件动态请求子节点数据并更新图形。

相关文章:

Vue2项目实战:用AntV G6打造可折叠树形结构(附完整代码)

Vue2与AntV G6深度整合:构建企业级可交互树形可视化方案 在数据密集型的现代Web应用中,树形结构可视化已成为组织架构展示、文件目录管理、决策流程分析等场景的核心需求。本文将基于Vue2框架与AntV G6可视化引擎,从工程化角度完整呈现一个支…...

DAMO-YOLO与MySQL数据库集成:检测结果存储与分析方案

DAMO-YOLO与MySQL数据库集成:检测结果存储与分析方案 1. 引言 在实际的AI视觉项目中,我们经常会遇到这样的需求:不仅要实时检测出图像中的目标,还需要长期保存检测结果以便后续分析和统计。比如在安防监控中,我们需要…...

第 4 篇:内容即数据——frontmatter 规范、数据结构与构建链路的工程化设计

📌 本篇核心目标:建立"内容文件不是文本,而是系统输入"的工程化思维。掌握 frontmatter 字段设计方法论、slug 规则、分类标签治理策略、核心实体的 schema 设计,以及从内容到页面的完整构建链路。这篇为什么是整本小册…...

Git “archive“ 命令实战指南:从基础到高阶应用

1. Git archive命令基础入门 第一次接触git archive命令时,我正面临一个棘手问题:需要把项目代码打包发给客户,但又不想泄露整个Git历史记录。这个看似简单的需求,让我发现了git archive这个宝藏命令。 git archive的核心功能是将…...

Gitee团队协作全流程:从SSH配置到仓库管理的保姆级指南

Gitee团队协作全流程:从SSH配置到仓库管理的保姆级指南 在当今快节奏的软件开发环境中,高效的团队协作工具已经成为项目成功的关键因素。作为国内领先的代码托管平台,Gitee不仅提供了稳定的Git服务,还针对中文开发者优化了团队协作…...

元宇宙拆迁队长:强拆违规NFT日入百万的技术法则

第一章 智能合约漏洞:测试工程师的狩猎场在OpenSea平台12%的NFT因元数据违规被下架、BAYC项目因权限漏洞损失2000个稀有资产的背景下,测试工程师凭借代码审计能力构建起新的技术护城河。其核心战场聚焦三大漏洞矩阵:重入攻击陷阱利用ERC-721合…...

【ROS2】机械臂抓取——gazebo_grasp_plugin编译排障与模型集成实战

1. 环境准备与源码获取 最近在做一个机械臂抓取项目时,遇到了gazebo_grasp_plugin这个神奇的插件。说实话,从下载到成功运行的过程真是踩了不少坑,今天就把这些经验完整分享给大家。首先需要明确的是,我们使用的是ROS2 Humble版本…...

JPEGView:高效轻量级图像查看器的技术解析与应用指南

JPEGView:高效轻量级图像查看器的技术解析与应用指南 【免费下载链接】jpegview Fork of JPEGView by David Kleiner - fast and highly configurable viewer/editor for JPEG, BMP, PNG, WEBP, TGA, GIF and TIFF images with a minimal GUI. Basic on-the-fly ima…...

C++ 08:对象数组——批量管理对象的高效方式

对象数组本质是元素为类对象的数组,和基本类型数组用法相似,但会自动触发每个对象的构造与析构函数,是批量管理同类对象的核心工具。一、核心概念与语法1. 定义对象数组类名 数组名[数组长度];定义时系统会为每个元素自动调用匹配的构造函数完…...

LiuJuan20260223Zimage赋能微信小程序:智能对话功能快速实现

LiuJuan20260223Zimage赋能微信小程序:智能对话功能快速实现 最近在捣鼓一个微信小程序项目,想给它加个“聪明的大脑”,让用户能和它像朋友一样聊天。找了一圈方案,要么太复杂,要么效果不理想。直到我试了试这个叫Liu…...

开源大模型部署新选择:StructBERT中文相似度模型镜像免配置实战手册

开源大模型部署新选择:StructBERT中文相似度模型镜像免配置实战手册 你是不是也遇到过这样的场景?手里有一堆中文文本,想快速判断它们之间的相似度,比如检查用户提问是否重复、给文档自动分类、或者做智能客服的意图匹配。但一想…...

Cosmos-Reason1-7B辅助操作系统概念学习:虚拟内存与进程调度详解

Cosmos-Reason1-7B辅助操作系统概念学习:虚拟内存与进程调度详解 操作系统这门课,对很多计算机专业的学生来说,就像一座横在面前的大山。书上的概念抽象,各种调度算法、内存管理机制听起来像天书,光靠死记硬背&#x…...

4步掌握音乐转录技术:让AI将音频无缝转换为乐谱的实战指南

4步掌握音乐转录技术:让AI将音频无缝转换为乐谱的实战指南 【免费下载链接】mt3 MT3: Multi-Task Multitrack Music Transcription 项目地址: https://gitcode.com/gh_mirrors/mt/mt3 副标题:如何用MT3解决多乐器音乐的精准记谱难题 当乐队即兴演…...

Live Avatar性能调优:不用改代码,参数组合提速40%

Live Avatar性能调优:不用改代码,参数组合提速40% 1. 性能瓶颈分析 1.1 显存使用机制解析 Live Avatar作为14B参数的大模型,其显存占用主要来自三个部分: 模型参数加载:21.48GB/GPU(FSDP分片后&#xf…...

专家观点:图形管线的变革

多年来,图形管线一直依赖于成熟且固定的功能工作负载,如几何处理、光栅化、纹理贴图和着色。这种传统方法为渲染提供了可预测的结构,每个阶段都提供特定且易于理解的功能。然而,这种模式已经悄然发生了深刻转变。现代渲染的特点如…...

Boomi连续第12次获评“领导者”,并在2026年Gartner®集成平台即服务(iPaaS)魔力象限™中于“执行能力”维度位列最高

Boomi™(数据激活领域企业)今日宣布,其在2026年Gartner集成平台即服务(iPaaS)魔力象限™中获评“领导者”,并在“执行能力”维度位居最高。这是Boomi连续第12次获评该报告“领导者”,亦是该魔力…...

FUTURE POLICE真实案例:前端语音解析系统完整搭建过程

FUTURE POLICE真实案例:前端语音解析系统完整搭建过程 你是不是也遇到过这样的问题?手头有一段重要的会议录音,或者一个需要添加字幕的视频素材,但手动对齐字幕时间轴简直是一场噩梦。一句一句听,一帧一帧调&#xff…...

Keenfolks正式推出KEENFOLKS X_

面向企业增长打造的全球AI原生营销基础设施网络 作为一家为Coca-Cola、Diageo、Mars、Reckitt、Nestl及Merck-MSD等品牌提供营销项目支持的AI转型合作伙伴,Keenfolks今日宣布推出全新全球营销网络KEENFOLKS X_。该网络基于共享的AI基础设施构建,旨在为企…...

南北阁Nanbeige 4.1-3B Python源码分析工具开发实战

南北阁Nanbeige 4.1-3B Python源码分析工具开发实战 大型Python项目的维护痛点:代码越写越乱、性能瓶颈难定位、团队协作效率低。本文将展示如何用南北阁Nanbeige 4.1-3B模型构建智能源码分析工具,让代码维护变得简单高效。 1. 项目背景与需求场景 每个…...

Credo 推出面向新一代 AI 应用的 Robin 800G 光 DSP 系列

高度集成、高性能、高能效 —— 灵活部署方案加速 AI 基础设施建设Credo Technology Group Holding Ltd (Credo)(纳斯达克代码:CRDO),一家通过提供快速、可靠且高能效的系统解决方案,引领规模互…...

Z-Image-Turbo_Sugar脸部Lora模型版本管理与回滚:基于Git的工作流实践

Z-Image-Turbo_Sugar脸部Lora模型版本管理与回滚:基于Git的工作流实践 你是不是也遇到过这种情况?花了好几天时间,用Z-Image-Turbo模型微调了一个专门生成Sugar风格脸部的Lora模型,效果特别满意。结果手一抖,在原来的…...

Dify 代码执行安装自定义 Python 依赖及权限问题解决

一直都在比较深度的使用 Dify AI开发平台,今天做某个 agent 需求需要用到执行 python 脚本,并且要导入一些默认沙盒没有安装的依赖,比如 jaydebeapi、pandas等等。因为 dify 默认为了安全运行沙盒都是白名单模式,没有配置在内的权…...

Nanbeige 4.1-3B惊艳案例分享:30亿参数在复古UI中生成神谕级回答

Nanbeige 4.1-3B惊艳案例分享:30亿参数在复古UI中生成神谕级回答 1. 像素冒险中的AI对话革命 在当今AI交互界面普遍追求极简风格的大环境下,Nanbeige 4.1-3B带来了一场视觉与功能的双重革新。这套专为30亿参数大模型设计的"像素游戏风"对话前…...

【稀缺首发】中国某星座在轨卫星真实OBC源码片段(脱敏版):仅限本文公开的3段高可靠C代码——看懂如何用volatile+memory barrier应对单粒子翻转

第一章:低轨卫星C语言代码示例低轨卫星(LEO)嵌入式系统对实时性、内存占用和抗辐射鲁棒性有严苛要求,C语言因其零开销抽象、确定性执行与硬件级控制能力,成为星载软件开发的主流选择。以下示例模拟星务计算机中常见的遥…...

Nanbeige 4.1-3B惊艳效果:夜间模式切换与像素风格暗色适配

Nanbeige 4.1-3B惊艳效果:夜间模式切换与像素风格暗色适配 1. 复古像素风AI对话体验革新 在AI交互界面设计趋同化的今天,Nanbeige 4.1-3B的像素冒险聊天终端带来了一股清新之风。这套专为4.1-3B模型设计的前端界面,彻底颠覆了传统聊天机器人…...

ChromePass:3分钟找回Chrome浏览器所有密码的完整指南

ChromePass:3分钟找回Chrome浏览器所有密码的完整指南 【免费下载链接】chromepass Get all passwords stored by Chrome on WINDOWS. 项目地址: https://gitcode.com/gh_mirrors/chr/chromepass 你是否曾经在登录重要网站时,明明记得Chrome保存过…...

OpenCV手势识别实战:用convexityDefects函数实现数字手势检测(附完整代码)

OpenCV手势识别实战:用convexityDefects函数实现数字手势检测 手势识别作为人机交互的重要方式,在智能家居、虚拟现实、医疗康复等领域有着广泛应用。本文将带你从零开始,使用OpenCV的convexityDefects函数实现一个完整的数字手势识别系统。不…...

Qwen3-TTS-1.7B-Base实操手册:批量文本转语音+多音色并行生成

Qwen3-TTS-1.7B-Base实操手册:批量文本转语音多音色并行生成 想不想让电脑帮你把大段文字自动念出来,还能用不同人的声音、不同的语言来读?今天要聊的Qwen3-TTS-1.7B-Base,就是这样一个“声音魔法师”。它不仅能听懂你的文字&…...

从零到一:用Gen6D和COLMAP为自己的小物件做6D位姿估计(鼠标/充电器实测)

从零到一:用Gen6D和COLMAP实现自定义物体的6D位姿估计实战指南 当你拿起桌上的无线鼠标时,大脑能瞬间判断它的位置和朝向——这种空间感知能力对机器人而言却是巨大的挑战。6D位姿估计技术正试图赋予机器这种三维空间理解能力,而Gen6D作为202…...

# 智能交通系统中的多源数据融合:基于Python的实时车辆轨迹预测实战在智能交

智能交通系统中的多源数据融合:基于Python的实时车辆轨迹预测实战 在智能交通系统(ITS)中,精准的车辆轨迹预测能力是实现动态路径规划、拥堵预警和自动驾驶协同的核心支撑技术之一。本文将围绕如何利用Python构建一个轻量级但高效…...