咱要在 Vue 项目里搞组织架构图,就像搭积木,有好几种 "积木套装" 可选,比如 antV G6、D3.js、vue3-tree-org、mind - map 还有 vueflow 。下面咱从几个方面唠唠,看看哪个 "套装" 最对咱胃口。
- G6 g6.antv.antgroup.com/examples/sc...
- D3.js juejin.cn/post/720621...
- vue3-tree-org gitee.com/sangtian152...
调研结论
一、上手难度:谁是新手友好型?
- antV G6:要是你熟 Vue 开发,也懂点可视化,那用它就像学骑自行车,不难上手。安装、引入都简单,官方文档讲初始化、数据配置啥的也挺清楚。但要是想折腾复杂交互和超炫样式,那就得花点时间啃它那一大摞 API 手册,像研究一本有点厚的武功秘籍。
- D3.js:这货就像个毛坯房,啥现成功能都没有,得靠你自己用 JavaScript 代码和数据可视化知识一点点 "装修" 出想要的图形。对新手来说,就像让一个没盖过房子的人直接去盖别墅,太难了!就算有很多漂亮样板间(示例),但照着盖也不容易,门槛挺高。
- vue3-tree-org:如果你是 Vue3 的老玩家,用它就像玩拼图,上手很快。它专门为树状结构设计,就像拼图里都是按树状关系拼的块,处理组织架构图这种典型树状结构,你能很快搞懂咋用它的组件和配置,轻松上手。
- mind - map:它就像思维导图,和组织架构图有点像,使用起来很直观,主要就是摆弄节点的层级关系。要是你平常就爱用思维导图,那用它就像用惯了一种笔,很顺手。不过要在 Vue 项目里用它,可能还得稍微改改,像给笔换个笔帽。
- vueflow:它功能多、配置灵活,上手难度中等。刚接触时,理解它的数据流和组件用法,就像走迷宫,得花点时间。好在它有详细的地图(官方文档和示例),能帮你快速找到出口,熟悉起来也不难。
二、功能特性:谁的 "十八般武艺" 更厉害?
- antV G6:这简直是个图形魔法师,渲染节点、边的样式,能精细到每个细节,想让节点像星星、像月亮都行。布局算法多,特别是树状布局,展示组织架构图就像把家族树画得明明白白。交互功能也丰富,能点击节点看员工详细信息,还能拖拽节点调整位置,就像在玩一个互动游戏。
- D3.js:它像个超级定制大师,能通过操作数据做出任何你能想到的图形效果,图形图表都能做得超漂亮。但问题是,很多基础功能都得你自己动手实现,就像定制家具,得从选木材开始一步步来,在组织架构图的布局算法和现成交互方面,不像 antV G6 那样直接给你准备好。
- vue3-tree-org:它是个专注树状结构的 "专家",处理组织架构图时,节点层级关系展示得清清楚楚,设置节点样式、展开收起节点这些操作都很方便。不过和 antV G6 比,在图形渲染的丰富程度和复杂交互上,就像自行车和汽车比速度,稍逊一筹。
- mind - map:它就像个简单的层级梳理器,以思维导图为核心,展示简单组织架构还行,有基本的节点添加、删除、展开收起功能。但在样式定制和复杂交互上,功能就像小孩玩具,比较有限。
- vueflow:它就像个功能齐全的乐高套装,节点和边的自定义选项多,布局方式也多,能搭出复杂的流程图和组织架构图。交互方面,能实现节点拖拽、连接,还能自己设定交互逻辑,玩法很多。
三、性能表现:谁是 "长跑健将"?
- antV G6:数据量不大到中等时,它就像个短跑选手,跑得贼快,性能杠杠的。但要是数据量一大,就像长跑时背了太多东西,可能会跑不动,不过可以通过数据分页加载、用虚拟列表这些 "减负" 方法,让它继续跑起来。
- D3.js:它的性能就像一辆改装车,取决于开发者咋改装(实现方式)。要是改得好,处理大量数据也能跑得很快,但对一般人来说,改装难度就像给飞机换发动机,太难了。
- vue3-tree-org:它就像一辆普通轿车,针对树状结构优化过,处理常规规模的组织架构数据时,开得稳稳当当。但数据量突然暴增,就像车超载了,可能会跑得卡顿。
- mind - map:它像个小电动车,性能一般,适合展示小规模组织架构。数据量一增多,就像小电动车电量不足,节点层级展开和渲染都会变慢。
- vueflow:它像一辆经过调校的跑车,在性能上有优化,能应对中等规模数据量的组织架构图展示。但要是数据量变得超级大,也得像跑车进维修站一样,进行性能优化。
四、适用场景:谁才是 "最佳搭档"?
- antV G6:适合那些对组织架构图可视化效果要求高、交互性要丰富,而且数据量可能不小的企业级应用。就像给大企业设计一个超炫的组织架构展示大屏,要展示复杂层级、员工详细信息,还得能灵活操作,它就是最佳选择。
- D3.js:适合那些对图形定制有超高要求,而且开发者 JavaScript 和可视化能力超强的项目。比如要做一个独特得像外星建筑一样的组织架构图展示,不按常规树状布局来,那就选它。
- vue3-tree-org:适合 Vue3 项目里,对组织架构图功能需求简单,就想把树状结构展示清楚的场景。就像给小公司做个简单的人员结构展示页面,主要突出层级关系,它就够用了。
- mind - map:适合展示简单、层级不复杂的组织架构,更注重梳理节点间逻辑关系。就像创业团队刚开始规划组织架构,用它梳理一下思路很合适。
- vueflow:适合在 Vue 项目里构建复杂流程图和组织架构图,而且对交互体验和功能丰富度有一定要求的场景。比如在项目管理系统里,要把组织架构和工作流程结合起来展示,它就能大显身手。
总的来说,在 Vue 项目里搞组织架构图,antV G6 功能全面、可视化和交互都很棒,能适应很多场景;vue3-tree-org 适合简单树状结构;D3.js 适合高手搞定制;mind - map 适合简单层级梳理;vueflow 适合构建复杂交互的组织架构图。开发者可以根据项目实际需求、自己的技术水平和团队情况,挑个最合适的 "积木套装" 来搭建组织架构图。
使用 AntV G6 实现组织架构功能
下面将详细介绍如何在项目中使用 AntV G6 来构建组织架构图。
一、准备工作
(一)安装 AntV G6
如果你使用的是 npm,在项目目录下运行以下命令进行安装:
sql
npm install @antv/g6 --save
若是使用 yarn,则执行:
sql
yarn add @antv/g6
(二)引入 AntV G6
在你的 Vue 组件中,引入 G6:
javascript
import G6 from '@antv/g6';
二、准备组织架构数据
组织架构数据通常以树状结构呈现。假设我们有如下的数据结构:
css
const data = {
nodes: [
{ id: '1', label: 'CEO', department: '总经办' },
{ id: '2', label: 'CTO', department: '技术部' },
{ id: '3', label: '技术主管', department: '技术部' },
{ id: '4', label: 'CFO', department: '财务部' }
],
edges: [
{ source: '1', target: '2' },
{ source: '1', target: '4' },
{ source: '2', target: '3' }
]
};
其中,nodes数组表示节点,每个节点包含id(唯一标识)、label(节点名称,如职位)、department(所属部门)等属性;edges数组表示边,source和target分别指向边的起始节点id和结束节点id,以此来确定组织架构中的上下级关系。
三、初始化 G6 图表
在 Vue 组件的mounted钩子函数中初始化 G6 图表:
xml
<template>
<div ref="container" style="width: 100%; height: 600px;"></div>
</template>
<script>
export default {
mounted() {
this.initG6();
},
methods: {
initG6() {
const graph = new G6.Graph({
container: this.$refs.container,
width: this.$refs.container.offsetWidth,
height: this.$refs.container.offsetHeight,
layout: {
type: 'dendrogram', // 使用树状布局,非常适合组织架构图
direction: 'LR' // 从左到右布局,也可以根据需求改为其他方向,如TB(从上到下)
}
});
graph.data(data);
graph.render();
}
}
};
</script>
上述代码中,通过new G6.Graph创建一个 G6 图表实例,指定渲染容器为ref为container的div元素,并设置图表的宽度和高度。layout属性选择了dendrogram树状布局,并指定布局方向为从左到右。最后,将准备好的组织架构数据通过graph.data(data)方法传入图表,并调用graph.render()进行渲染。
四、定制节点和边的样式
(一)定制节点样式
可以根据节点的不同属性来定制样式,例如根据职位设置不同的节点颜色和形状:
ini
graph.node((node) => {
let shape = 'circle';
let color = 'gray';
if (node.label === 'CEO') {
shape = 'diamond';
color = 'green';
} else if (node.label === 'CTO' || node.label === 'CFO') {
shape ='rect';
color = 'blue';
}
return {
shape,
style: {
fill: color,
stroke: 'black',
lineWidth: 2
}
};
});
在这段代码中,通过graph.node方法传入一个回调函数,根据节点的label属性来确定节点的形状shape和颜色color。每个节点返回一个包含shape和style的对象,style中定义了节点的填充颜色fill、边框颜色stroke和边框宽度lineWidth。
(二)定制边的样式
同样可以对边的样式进行定制,比如设置边的颜色和粗细:
javascript
graph.edge((edge) => {
return {
style: {
stroke: 'gray',
lineWidth: 2
}
};
});
上述代码通过graph.edge方法传入回调函数,为每条边设置了灰色的线条颜色stroke和宽度为 2 的lineWidth。
五、添加交互功能
(一)点击节点显示详细信息
为了让组织架构图更具交互性,我们可以实现点击节点显示其详细信息的功能:
ini
graph.on('node:click', (e) => {
const node = e.item;
const data = node.get('model');
alert(`姓名: ${data.label}\n部门: ${data.department}`);
});
这段代码通过graph.on方法监听node:click事件,当节点被点击时,获取被点击的节点item,进而获取节点的数据模型model,并通过alert弹出节点的姓名(label)和部门(department)信息。
(二)其他交互功能
AntV G6 还支持许多其他交互功能,如节点的拖拽、缩放等。例如,要实现节点的拖拽功能,可以启用 G6 的dragNode行为:
css
graph.addBehaviors(['dragNode']);
通过上述步骤,我们就利用 AntV G6 在项目中成功实现了一个具有基本样式定制和交互功能的组织架构图。根据实际业务需求,还可以进一步扩展和优化,如动态更新数据、添加更多复杂的交互逻辑等。