topology-graph-vue
| Install | |
|---|---|
npm install topology-graph-vue |
|
| Latest Version: | 1.2.17 |
| Vue: | 3 |
| License: | MIT |
| Last Updated: | Sep 22, 2026 |
| Links: | Gitee · npm |
🕸️ TopologyGraph Vue
🚀 基于 PixiJS v8 的高性能 Vue 3 拓扑图组件库,支持 50,000+ 节点 60 FPS 流畅渲染。
TopologyGraph Vue 面向关系图谱、组织架构、风控网络、资产关联等拓扑可视化场景,提供高性能渲染、布局算法、交互控制和 Vue 组件化集成能力。
✨ 核心特性
- ⚡ 高性能渲染:LOD 多级降级渲染、空间索引裁剪、对象池复用、GPU 预览模式与 Worker 力导向布局,支持 5 万以上节点流畅展示。
- 🎨 丰富图形能力:支持圆形、矩形、菱形、六边形、星形节点;实线、虚线、点线;直线、贝塞尔、弧线和阶梯连线,可自动翻转曲线方向并控制曲率。
- 🧭 灵活布局:内置 Barnes-Hut 力导向、四方向树形、径向与环形布局;大规模力导向计算在 Worker 中执行,可保持页面交互响应。
- 🖱️ 完整交互:支持拖拽、缩放、框选、多选、搜索定位、聚焦高亮、节点间连线绘制、撤销重做、右键菜单与图片导出。
- 🔄 增量更新:支持节点、连线的局部更新,并在更新端点时维护渲染索引与数据完整性。
- 🧩 组件化集成:提供主画布、小地图、选区操作框与浮动工具栏,支持 Vue 插件注册和按需引入。
- 🌗 主题与定制:内置亮色、暗色主题,支持运行时更新样式、性能参数、LOD 阶梯和自定义绘制回调。
🎯 适用场景
- 👥 人物、企业、股权、社交等关系图谱
- 🛡️ 资金交易、风险传播、资产关联网络
- 🏗️ 组织架构、知识图谱、服务依赖拓扑
- 🗺️ 需要高性能缩放、平移和交互的复杂可视化画布
🧭 快速导航
📦 安装 · 🚀 快速开始 · 🗂️ 数据格式 · 📚 完整参考 · 📡 事件 · ⚡ 性能建议 · 📝 更新日志
📦 安装
npm install topology-graph-vue
依赖要求:
- Node.js >= 18.0.0
- Vue ^3.3.0 || ^3.4.0 || ^3.5.0
- PixiJS ^8.17.1(自动安装)
🚀 快速开始
🌐 全局注册
import { createApp } from 'vue'
import TopologyGraph from 'topology-graph-vue'
import 'topology-graph-vue/style.css'
const app = createApp(App)
app.use(TopologyGraph)
app.mount('#app')
全局注册后可直接使用以下组件:
| 组件 | 说明 |
|---|---|
<TopologyGraph> |
主组件,提供画布与 API 注入 |
<TopologyGraphMinimap> |
小地图 |
<TopologyGraphSelectionBox> |
选区操作框 |
<TopologyGraphToolbar> |
浮动工具栏 |
<template>
<TopologyGraph @ready="onReady" @canvas-contextmenu="onContextMenu">
<TopologyGraphMinimap position="right-bottom" />
<TopologyGraphSelectionBox />
</TopologyGraph>
</template>
<script setup lang="ts">
function onReady(api) {
api.setJsonData({
nodes: [
{ id: '1', text: '节点 1' },
{ id: '2', text: '节点 2' },
],
lines: [{ from: '1', to: '2' }],
})
api.applyLayout({ type: 'force' })
}
function onContextMenu(event, targetType, target) {
console.log('右键点击:', { targetType, target })
}
</script>
🧩 按需引入
<script setup lang="ts">
import { Minimap, SelectionBox, TopologyGraph } from 'topology-graph-vue'
import 'topology-graph-vue/style.css'
</script>
<template>
<TopologyGraph @ready="onReady">
<Minimap position="right-bottom" />
<SelectionBox />
</TopologyGraph>
</template>
🗂️ 数据格式
通过 setJsonData 设置图数据,兼容 relation-graph 的字段名:
api.setJsonData({
nodes: [
{ id: '1', text: '节点 A', color: '#1890ff' },
{ id: '2', text: '节点 B', color: '#52c41a' },
],
lines: [
{ from: '1', to: '2', showEndArrow: true },
],
})
- 节点至少需提供唯一的
id。 - 连线支持
from/to或source/target两套字段。 - 节点可配置
shape、radius、color、icon、fixed等属性。 - 连线可配置
style、curve、animation、showEndArrow等属性。
🧰 常用 API
@ready 回调会返回图实例 API:
| 类别 | 常用方法 |
|---|---|
| 🎯 视图控制 | fitView()、resetView()、zoomIn()、zoomOut()、panBy() |
| 🗂️ 数据管理 | setJsonData()、getJsonData()、addNode()、addLine()、updateNode()、updateLine()、removeNodeById() |
| 🧭 布局 | applyLayout() |
| 🖱️ 交互 | focusOnNode()、searchAndFlyTo()、selectAll()、clearSelection() |
| 🎨 样式与配置 | setOptions()、toggleTheme()、setNodeShape()、setLineStyle() |
| 📤 导出 | downloadAsImage()、downloadFullGraphAsImage() |
🔄 局部更新与连线绘制
使用局部更新 API 可避免重新设置整张图的数据:
api.updateNode('node-a', {
text: '已更新的节点',
color: '#f5222d',
radius: 32,
})
api.updateLine('line-a', {
to: 'node-c',
text: '新的依赖关系',
color: '#1890ff',
curve: 'bezier',
})
updateNode() 只接受节点的持久化字段,不能修改 id、selected、hovered 或 highlighted 等交互状态。updateLine() 不能修改连线 ID;更新 from 或 to 时,两个端点必须引用已存在的节点。节点或连线不存在、端点无效时均返回 undefined,且不会修改现有数据。
可通过 API 或组件事件控制连线绘制:
api.setLineDrawingMode(true)
// 也可由业务逻辑显式指定起点和终点
api.startLineDrawing('node-a')
const line = api.finishLineDrawing('node-b')
api.cancelLineDrawing()
连续绘制模式下,依次点击两个节点即可创建连线。组件会发出 line-draw-start、line-created 和 line-draw-cancel 事件;line-created 会携带新连线、起点节点和终点节点。
🎯 视图定位
fitView() 默认适应全部可见节点。传入 nodes 或 lines 后,会将指定目标完整置于画布中心;连线的两端节点会自动纳入可见范围。
nodes 和 lines 均支持传入元素对象或 ID,且可同时使用。重复目标会自动去重。未传目标或两个数组均为空时,适应全部可见节点。
// 同时适应多个节点和连线,并聚焦全部有效目标
api.fitView({
nodes: ['node-1', api.getNodeById('node-2')!],
lines: ['line-1', api.getLineById('line-2')!],
padding: 80,
animate: true,
duration: 400,
focus: true,
})
// 只适应所有可见节点(不使用动画)
api.fitView()
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
nodes |
Array<GraphNode | string> |
[] |
目标节点对象或节点 ID 列表 |
lines |
Array<GraphLine | string> |
[] |
目标连线对象或连线 ID 列表 |
padding |
number |
50 |
画布边距,单位为屏幕像素 |
animate |
boolean |
false |
是否平滑过渡到目标视图 |
duration |
number |
300 |
动画时长,单位为毫秒 |
focus |
boolean |
false |
是否高亮全部有效的目标节点与连线 |
动画期间使用 GPU 视图变换,避免逐帧完整重绘;动画结束后才进行一次完整渲染。fitView 的目标缩放范围固定为 1% 到 100%,不影响滚轮、zoomTo() 或 setViewport() 的全局缩放范围。也可继续传入数字作为边距,例如 api.fitView(80)。
🧭 布局
// 力导向布局
api.applyLayout({
type: 'force',
iterations: 300,
repulsion: 2000,
springLength: 60,
})
// 树形布局
api.applyLayout({
type: 'tree',
direction: 'bottom',
levelDistance: 120,
})
// 径向或环形布局
api.applyLayout({ type: 'center' })
api.applyLayout({ type: 'circle' })
力导向布局在大数据量下会在 Worker 中异步计算,调用后可继续响应缩放、平移和取消操作。可监听布局生命周期事件处理加载状态:
<TopologyGraph
@layout-start="layouting = true"
@layout-end="layouting = false"
/>
🎨 运行时配置
api.setOptions({
theme: 'dark',
nodeAboveLines: true,
lineDrawing: {
preview: { style: 'dashed', color: '#faad14', width: 2 },
line: { style: 'solid', color: '#1890ff', width: 2 },
allowDuplicateLines: true,
},
lodTiers: [
{ minScale: 1, nodeMode: 'detail', lineMode: 'detail' },
{ minScale: 0.2, nodeMode: 'simple', lineMode: 'simple' },
{ minScale: 0.008, nodeMode: 'dot', lineMode: 'hide' },
],
})
lineDrawing.preview 只影响鼠标拖动时的临时预览线,lineDrawing.line 只影响绘制成功后自动添加的正式连线。两部分都支持 style(solid / dashed / dotted)、color 和 width,也可以在初始化配置中传入同样的结构。allowDuplicateLines 控制是否允许同一方向的重复连线,默认值为 true。
📚 完整参考
根 README 是 npm 用户文档入口。以下接口均从包中导出的 TypeScript 类型整理而来,示例中的 GraphNode、GraphLine 等类型可以直接从 topology-graph-vue 导入。
🧩 <TopologyGraph> 属性与插槽
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
width |
number |
容器宽度 | 画布宽度(px);也会覆盖 options.width |
height |
number |
容器高度 | 画布高度(px);也会覆盖 options.height |
theme |
'light' | 'dark' |
'light' |
初始主题;显式传入时覆盖 options.theme |
devMode |
boolean |
false |
显示性能监控浮层 |
options |
Partial<TopologyOptions> |
{} |
初始化配置;运行时可用 api.setOptions() 部分更新 |
主组件暴露 getInstance(): GraphApi,并提供两个插槽:默认插槽用于放置 Minimap、SelectionBox、GraphToolbar 等子组件,overlay 插槽用于自定义画布叠加层。上述子组件必须写在 <TopologyGraph> 的默认插槽内,不能独立挂载;业务侧应通过 @ready 保存 GraphApi,不要重新创建核心实例。
初始化优先级为:显式组件属性 width / height / theme > options 对应字段 > 默认值。未传 theme 属性时,options.theme 会生效。options 的后续响应式更新会调用 setOptions();其中 lineDrawing、textConfig、perfConfig 和 themes 按字段合并,其余对象或数组字段整体替换。
🗺️ 子组件属性
<Minimap>
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
width |
number |
220 |
小地图宽度(px) |
height |
number |
140 |
小地图高度(px) |
position |
MinimapPosition |
'right-bottom' |
right/left/top/bottom 与 center 的组合位置 |
dotSize |
number |
3 |
节点圆点半径(px) |
viewportColor |
string |
'#1890ff' |
视口框颜色 |
backgroundColor |
string |
跟随主题 | 小地图背景色;传入时覆盖主题默认值 |
未传入 backgroundColor 时,小地图会订阅主图的主题状态:切换 light / dark 后,容器、Canvas 背景和缩放标签会同步更新。传入自定义背景色后,主题切换不会覆盖该颜色。
<SelectionBox>
无需必填属性。组件通过注入的 GraphApi 显示当前选区,支持默认删除按钮和两个插槽:默认插槽、toolbar 插槽(插槽参数包含 selectedCount、isDragging、onDelete)。选区为空时不会渲染;右键会穿透到画布,因此画布右键菜单仍可使用。
<GraphToolbar>
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
position |
'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top-center' | 'bottom-center' | 'left-center' | 'right-center' |
'top-right' |
工具栏位置 |
direction |
'horizontal' | 'vertical' |
'horizontal' |
按钮排列方向 |
layout |
ButtonId[][] |
内置布局 | 二维按钮分组;组间自动插入分隔线 |
ButtonId 可用值:zoomIn、scale、zoomOut、fitView、resetView、fullscreen、force、tree:top、tree:bottom、tree:left、tree:right、radial、circle、download、import。
工具栏直接使用 GraphApi.isDarkTheme 响应主题变化,因此无论主题由 toggleTheme() 还是 setOptions({ theme }) 切换,工具栏的背景、边框、按钮和图标都会同步更新。
⚙️ TopologyOptions 配置
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
width / height |
number |
800 / 600 |
核心画布尺寸(主组件属性优先) |
theme |
Theme |
'light' |
light 或 dark |
minimapCanvas |
HTMLCanvasElement |
无 | 将已有 Canvas 作为小地图画布 |
enableHistory |
boolean |
true |
是否启用撤销/重做 |
nodeShape |
NodeShape |
'circle' |
默认节点形状 |
defaultNodeRadius |
number |
30 |
新节点默认半径(px);通过 setOptions() 更新时会同步到已有节点 |
lineStyle |
LineStyle |
'solid' |
默认连线样式 |
lineCurve |
LineCurve |
'straight' |
默认连线曲线 |
lineCurveAutoReverse |
boolean |
false |
贝塞尔/弧线是否按端点相对角度自动选择弯曲方向 |
lineCurveOffset |
number |
- | 全局曲率偏移;正负值控制贝塞尔/弧线弯曲侧 |
lineWidth |
number |
1 |
全局连线宽度倍率 |
lineDrawing |
LineDrawingOptions |
见下表 | 连线绘制预览线、正式线和重复策略 |
lineFontSize |
number |
0 |
全局连线文字大小;0 为自动计算 |
nodeAboveLines |
boolean |
false |
是否始终把节点及文字绘制在连线之上 |
gridColor / gridSubColor |
string |
主题默认值 | 网格主线/副线 CSS 颜色 |
canvasBackground |
string |
主题背景 | 画布背景 CSS 十六进制颜色(#RGB / #RRGGBB);暂不支持透明度 |
focusZoom |
number |
1 |
聚焦目标缩放比例 |
zoomStep |
number |
0.05 |
每次放大/缩小的比例步长 |
rendererInit |
RendererInitOptions |
见下表 | 仅创建 Pixi 渲染器时读取,运行时 setOptions() 不更新 |
themes |
Partial<Record<'light' | 'dark', Partial<ThemeConfig>>> |
主题默认值 | 覆盖指定主题的颜色字段;可只覆盖一个主题 |
lodTiers |
LODTier[] |
DEFAULT_LOD_TIERS |
按缩放比例选择节点渲染等级;非法项会忽略,剩余项按 minScale 降序处理 |
perfConfig |
TopologyOptions['perfConfig'] |
DEFAULT_PERF_CONFIG |
当前图实例的渲染节流、文字和箭头参数 |
textConfig |
Partial<TextConfig> |
见下表 | 文本截断、换行和格式化 |
hoverNodeHighlight |
boolean |
false |
hover 时设置节点 highlighted |
hoverNodeLineHighlight |
boolean |
false |
hover 时设置关联连线 highlighted |
hoverLineHighlight |
boolean |
false |
hover 时设置连线 highlighted |
clickNodeHighlight |
boolean |
false |
click 时设置节点 selected |
clickNodeLineHighlight |
boolean |
false |
click 时高亮关联连线 |
clickLineHighlight |
boolean |
false |
click 时高亮连线 |
高亮开关只控制对应交互是否写入状态;通过数据或其他 API 设置的 selected / highlighted 状态仍会照常渲染。
曲线方向与偏移
lineCurveAutoReverse 仅影响未显式设置曲率的贝塞尔线和弧线:当连线端点顺序反向时,曲线会自动翻转到对应一侧,避免同一关系的反向连线重叠。需要固定弯曲侧或弯曲程度时,使用 lineCurveOffset;单条 GraphLine.curveOffset 优先于全局值。未设置偏移的平行曲线会继续自动分配不同曲率。
api.setOptions({
lineCurve: 'bezier',
lineCurveAutoReverse: true,
})
api.updateLine('line-a', { curve: 'arc', curveOffset: -0.18 })
// 需要全部曲线固定在同一侧时,改用全局偏移(此时自动方向不参与计算)
api.setOptions({ lineCurveOffset: 0.24 })
正负值分别控制曲线位于连线的两侧;数值越大,弯曲越明显。若需要让自动方向生效,请不要同时设置全局或单条连线的 curveOffset。
LineDrawingOptions
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
preview |
LineDrawingStyleOptions |
主题强调色 | 鼠标拖动中的临时线 |
line |
LineDrawingStyleOptions |
全局默认值 | 绘制成功后写入图数据的正式线 |
allowDuplicateLines |
boolean |
true |
是否允许同向重复连线 |
LineDrawingStyleOptions 的 style 为 solid / dashed / dotted,color 为 CSS 颜色(预览线传 null 恢复主题色),width 为逻辑像素宽度。
LODTier、TextConfig、ThemeConfig 与性能参数
| 类型 | 属性 | 类型/取值 | 说明 |
|---|---|---|---|
LODTier |
minScale |
number |
该等级的最小缩放比例,数组按从大到小排列 |
LODTier |
nodeMode |
detail | normal | simple | dot |
节点渲染模式 |
LODTier |
lineMode |
detail | normal | simple | hide |
detail 显示线/箭头/文字,normal 显示线/箭头,simple 仅显示线,hide 仅保留 forceDetail 连线 |
LODTier |
nodeDowngradeThreshold |
number |
已弃用兼容字段,不再影响渲染;请删除 |
LODTier |
lineDowngradeThreshold |
number |
已弃用兼容字段,不再影响渲染;请删除 |
TextConfig |
nodeTextMaxLength / lineTextMaxLength |
number |
最大字符数;0 不限制,默认 20 |
TextConfig |
nodeTextMaxWidth / lineTextMaxWidth |
number |
最大显示宽度(px);0 不换行 |
TextConfig |
textFormatter |
(text, type) => string |
自定义文本格式化;优先于长度截断,type 为 node 或 line |
ThemeConfig |
name |
light | dark |
主题名称 |
ThemeConfig |
background |
Pixi 数字颜色 | 背景色 |
ThemeConfig |
gridColor / gridSubColor |
Pixi 数字颜色 | 网格主线/副线颜色 |
ThemeConfig |
textColor |
Pixi 数字颜色 | 默认文字颜色 |
ThemeConfig |
lineColor |
Pixi 数字颜色 | 默认连线颜色 |
ThemeConfig |
selectionColor / hoverColor |
Pixi 数字颜色 | 选中/悬停高亮颜色 |
perfConfig |
nodeTextMinScale / lineTextMinScale |
number |
文字显示的最小缩放比例,默认 0.5 |
perfConfig |
hoverColorMinScale |
number |
低于该比例时的 hover 变色阈值,默认 0.5 |
perfConfig |
maxNodeTextCount / maxLineTextCount |
number |
节点/连线文字每帧最大绘制数量,默认均为 500;连线文字未超过预算时全部绘制,超过时按交互优先级、视口中心和屏幕网格避让处理 |
perfConfig |
textMaxCount |
number |
兼容旧配置,同时设置节点和连线文字预算;新代码建议使用两个独立字段 |
perfConfig |
renderThrottle |
number |
渲染节流间隔(ms),默认 16 |
perfConfig |
viewportBuffer / gridSize |
number |
视口缓冲区/空间索引网格尺寸,默认 200 / 40 |
perfConfig |
poolSize |
{ graphics?: number; text?: number } |
已弃用兼容字段,当前对象池不支持容量限制;请勿设置 |
perfConfig |
arrowGap / lineMultiOffset / lineLabelOffset |
number |
箭头间距/多连线间距/连线文字偏移 |
perfConfig |
msaaLevel |
number |
已弃用兼容字段;Pixi 初始化后无法可靠更新抗锯齿等级,请勿设置 |
perfConfig |
arrowBaseSize / arrowMinSize / arrowMaxSize |
number |
箭头基础、最小、最大尺寸 |
perfConfig |
lineBaseWidth |
number |
连线基础宽度倍率,默认 0.8;与 lineWidth 相乘后再受最小/最大宽度约束 |
perfConfig |
lineMinWidth / lineMaxWidth |
number |
连线屏幕宽度的最小/最大限制 |
perfConfig |
lineHoverWidthMultiplier |
number |
hover 时连线加粗倍率 |
RendererInitOptions
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
antialias |
boolean |
true |
是否启用 Pixi 抗锯齿 |
resolution |
number |
max(2, devicePixelRatio) |
画布物理分辨率倍率,必须大于 0 |
powerPreference |
'default' | 'high-performance' | 'low-power' |
'high-performance' |
GPU 功耗偏好 |
renderer |
'auto' | 'webgl' | 'canvas' |
'auto' |
渲染器选择;auto 自动探测,webgl / canvas 强制指定,优先级高于 canvasFallback |
canvasFallback |
boolean |
true |
低配自适应降级开关;探测到无 WebGL/WebGPU 上下文或仅软件渲染(SwiftShader / llvmpipe 等,无独立 GPU 的国产系统典型)时自动回退 PixiJS Canvas 2D 渲染器并降低抗锯齿/分辨率,保证可用与流畅。关闭则始终强制 WebGL(与旧版本行为一致) |
低配降级模式下组件会自动收紧 LOD 阈值与文字预算。存在独立背景画布时,拖拽和缩放只移动主画布的 CSS 合成层,背景网格保持不动,交互过程不重画整帧;松手或滚轮停稳后再按最终视口重绘一帧。没有独立背景画布时,交互预览仍限制在约 30fps。缩放过程中画面可能短暂发虚,停稳后恢复清晰。详情见 docs/PERFORMANCE-VS-G6.md(Git 仓库内)。正常 GPU 环境仍走原 WebGL 路径,渲染行为与旧版本完全一致。
rendererInit 必须作为组件 options 或 TopologyGraphCore.create() 的初始参数传入;实例创建后调用 setOptions({ rendererInit: ... }) 会被忽略。perfConfig.msaaLevel 为历史兼容字段,不会映射到 Pixi 初始化参数。
每个图实例分别保存主题、文字和性能配置;对一个实例调用 setOptions() 不会改动其他实例。网格颜色会写入当前实例主题,gridColor / gridSubColor 可与 theme 同时使用。DEFAULT_PERF_CONFIG 和 THEMES 仅作为新实例的默认值,不应在运行时直接修改。
连线文字未超过 maxLineTextCount 时全部绘制。超出预算时,先按 forceDetail、交互高亮和视口中心距离选择,再按相同优先级进行屏幕网格避让;候选会通过固定容量选择保留 Top K,避免大图每帧全量排序。
🎛️ GraphApi 完整方法
@ready 的参数、TopologyGraph 的 getInstance() 以及插槽子组件注入的都是 GraphApi。返回 Ref 的属性在脚本中使用 .value;Vue 模板会自动解包。
| 分组 | API | 参数与返回值 | 说明 |
|---|---|---|---|
| 状态 | stats |
Ref<PerfStats> |
FPS、渲染耗时、元素计数和当前缩放 |
| 状态 | isDarkTheme |
Ref<boolean> |
当前是否深色主题 |
| 状态 | canUndo / canRedo |
Ref<boolean> |
撤销/重做是否可用 |
| 视图 | resetView() |
void |
恢复初始视口 |
| 视图 | zoomIn() / zoomOut() |
void |
放大/缩小一级 |
| 视图 | zoomTo(scale?) |
void |
缩放到指定比例,默认 1 |
| 视图 | fitView(options?: FitViewOptions | number) |
void |
适配全部或指定节点/连线 |
| 视图 | getViewport() |
Viewport | null |
获取当前视口 |
| 视图 | setViewport(x, y, scale) |
void |
设置视口位置和缩放 |
| 视图 | toggleFullscreen() |
void |
切换画布全屏 |
| 连线 | startLineDrawing(source) |
boolean |
以节点对象或 ID 开始绘制 |
| 连线 | finishLineDrawing(target) |
GraphLine | null |
结束绘制并创建正式连线 |
| 连线 | cancelLineDrawing() |
boolean |
取消当前绘制 |
| 连线 | setLineDrawingMode(enabled) |
void |
开关连续绘制模式 |
| 连线 | isLineDrawing() |
boolean |
查询是否正在绘制 |
| 数据 | generateTestData(count) |
void |
生成指定节点数的测试数据 |
| 数据 | setJsonData(data, append?) |
void |
设置 JSON 数据;append=true 追加 |
| 数据 | getJsonData() |
GraphJsonData | null |
导出兼容 JSON 数据 |
| 数据 | doExport() |
{ nodes, lines } | null |
导出内部数据对象 |
| 数据 | importData(data) |
void |
导入内部 { nodes, lines } |
| 查询 | getNodes() / getLines() |
GraphNode[] / GraphLine[] |
获取全部节点/连线 |
| 查询 | getNodeById(id) / getLineById(id) |
元素 | undefined |
按 ID 查询 |
| 删除 | removeNodeById(id) |
void |
删除节点及关联连线 |
| 删除 | removeLineById(id) |
void |
删除单条连线 |
| 删除 | removeNodesByIds(ids) / removeLinesByIds(ids) |
void |
批量删除 |
| 数据 | dataUpdated(clearHighlight?) |
void |
增删节点或连线后同步渲染器并重绘;仅修改既有元素字段时无需调用。传入 true 会同时清除高亮状态 |
| CRUD | addNode(data) / addLine(data) |
元素 | undefined |
ID 或重复冲突时返回 undefined |
| CRUD | updateNode(id, patch) / updateLine(id, patch) |
元素 | undefined |
合并更新;不允许修改 ID |
| CRUD | addNodes(data) / addLines(data) |
元素数组 | 批量新增,跳过冲突项 |
| CRUD | updateNodePosition(id, x, y, animate?) |
void |
更新坐标,可动画过渡 |
| 布局 | applyLayout(options) |
void |
应用力导向、树形、径向或环形布局 |
| 交互 | focusOnNode(id) |
Promise<void> |
动画居中节点 |
| 交互 | flashNode(id, duration?) |
void |
闪烁提示节点 |
| 交互 | searchAndFlyTo(query) |
boolean |
搜索文本并飞行定位 |
| 交互 | deleteSelected() |
void |
删除当前选中的节点 |
| 交互 | moveSelectedNodesBy(dx, dy) |
void |
按偏移量移动选中节点 |
| 交互 | saveCurrentHistory() |
void |
手动保存历史快照 |
| 聚焦 | focusNodeById(id, options?) |
void |
聚焦节点及相邻连线 |
| 聚焦 | focusLineById(id, options?) |
void |
聚焦连线 |
| 聚焦 | cancelFocus() / isFocusing() |
void / boolean |
取消或查询聚焦状态 |
| 选择 | setEditingNodes(ids) |
void |
设置可编辑节点集合 |
| 选择 | setSelectedIds(ids) / selectAll() |
void |
设置选中集合或全选 |
| 选择 | clearSelection() / clearClickHighlight() |
void |
清除选择或 click 高亮 |
| 选择 | getSelectedNodeIds() |
Set<string> |
获取当前选中节点 ID |
| 样式 | toggleTheme() |
void |
切换主题 |
| 样式 | setNodeShape(shape) |
void |
设置默认节点形状 |
| 样式 | setLineStyle(style) / setLineCurve(curve) |
void |
设置默认连线样式/曲线 |
| 样式 | setLineWidth(width) |
void |
设置全局连线宽度倍率 |
| 样式 | setCustomDrawCallbacks(callbacks) |
void |
注册节点/连线自定义绘制回调 |
| 筛选 | applyFilter(color, text) |
void |
隐藏颜色或文本不匹配的元素 |
| 历史 | undo() / redo() |
void |
撤销或重做 |
| 导出 | downloadAsImage(filename?, options?) |
Promise<void> |
下载当前视口图片 |
| 导出 | downloadFullGraphAsImage(filename?, options?) |
Promise<void> |
按完整图边界下载图片 |
| 信息 | getViewInfo() |
视口、数量和边界 | null |
获取当前视图摘要 |
| 小地图 | minimapNodes |
Ref<{ id; x; y; color? }[]> |
小地图轻量节点数据 |
| 小地图 | getNodesForMinimap() |
轻量节点数组 | 获取小地图数据快照 |
| 配置 | setOptions(options) |
void |
部分更新运行时配置 |
| 选区 | selBoxVisible / selBoxBounds / selBoxCount |
Ref |
选区框可见性、边界和节点数 |
| 选区 | updateSelectionBounds() |
void |
重新计算选区边界 |
| 选区 | showSelectionBox() / hideSelectionBox() |
void |
显示或隐藏选区 UI,不改变 selected 状态 |
| 选区 | isSelectionBoxVisible() |
boolean |
查询选区框状态 |
| 桥接 | handleViewportChange(viewport) |
void |
供小地图同步主画布视口(一般无需业务调用) |
🧪 useTopologyGraph() 扩展 API
组合式函数返回 UseTopologyGraphReturn。上表中的公共方法同样可用,以下是仅组合式函数额外提供的状态或方法:performanceMode、panBy(dx, dy)、startLayout()、refresh()、getSelBoxState();另外 doExport()、importData()、selectAll()、removeNodesByIds() 和 removeLinesByIds() 可直接使用。组合式函数还提供 minimapNodes、handleViewportChange 之外的全部选区响应式状态,适合自定义 Vue 容器或不使用主组件的场景。
FocusOptions:animate(默认 true)、duration(默认 400ms)、zoom(undefined/true 使用 focusZoom,false 保持当前比例,数字表示指定比例)。
🧱 TopologyGraphCore 与事件发射器
非 Vue 场景可通过 TopologyGraphCore.create(canvas, options) 创建核心实例。GraphApi 已覆盖常用图操作;核心实例还提供以下底层方法:
| API | 参数与返回值 | 说明 |
|---|---|---|
TopologyGraphCore.create(canvas, options?) |
Promise<TopologyGraphCore> |
异步创建并初始化核心实例 |
setData(nodes, lines) |
void |
直接设置内部节点/连线数组 |
stop() / requestRender(force?) |
void |
停止渲染或请求一次渲染(底层控制) |
canUndo() / canRedo() |
boolean |
以方法形式查询历史状态 |
deleteNodesByIds(ids) |
void |
按 Set<string> 批量删除节点 |
zoomTo(scale, centerX?, centerY?) |
void |
指定缩放中心的底层版本 |
panTo(x, y) |
void |
平移到世界坐标 |
selectNode(id) / deselectNode(id) |
void |
选中或取消单个节点 |
getSelectedIds() |
Set<string> |
getSelectedNodeIds() 的兼容别名 |
highlightNode(id) / clearHighlight() |
void |
设置或清除通用高亮 |
setLineFontSize(size) |
void |
单独设置全局连线文字大小 |
startLayout(options?) / stopLayout() |
Promise<void> / void |
旧版力导向快捷方法及停止布局 |
setTheme(name) |
void |
直接设置主题 |
resize(width, height) |
void |
更新画布尺寸 |
getPerfStats() |
性能统计对象 | 获取核心层统计(含平均渲染耗时) |
refresh() |
void |
重置视图 |
destroy() |
void |
销毁实例并释放资源 |
核心实例继承 EventEmitter,可调用 on(event, handler)、off(event, handler)、once(event, handler)、removeAllListeners(event?) 和 listenerCount(event)。事件名及参数参见上面的 TopologyEvents 说明。
📦 数据模型
GraphNode
| 字段 | 类型 | 说明 |
|---|---|---|
id / text |
string |
唯一 ID / 显示文本 |
x / y |
number |
世界坐标 |
radius |
number |
节点半径 |
color |
string |
节点颜色 |
shape |
NodeShape |
circle / rect / diamond / hexagon / star |
icon |
string |
图片 URL 或图标资源 |
selected / hovered / highlighted |
boolean |
交互状态 |
hoverColor |
number |
Pixi 数字格式的悬停颜色 |
borderColor / borderWidth |
string / number |
边框颜色和宽度 |
fontColor / fontSize |
string / number |
文字颜色和大小 |
opacity |
number |
透明度 0~1 |
isHide |
boolean |
是否隐藏 |
forceDetail |
boolean |
忽略 LOD,始终详情渲染 |
fixed |
boolean |
力导向布局中固定位置 |
disabledDrag |
boolean |
禁止拖拽 |
flashing |
boolean |
是否闪烁 |
_level / expanded |
number / boolean |
树布局层级和展开状态 |
data |
any |
业务自定义数据 |
GraphLine
| 字段 | 类型 | 说明 |
|---|---|---|
id |
string |
连线唯一 ID |
from / to |
string |
起点和终点节点 ID |
text |
string |
连线显示文本 |
color / width |
string / number |
颜色和宽度 |
directed |
boolean |
是否有方向 |
style / curve / curveOffset |
LineStyle / LineCurve / number |
样式、曲线和曲率偏移;连线偏移优先于全局配置 |
selected / hovered / highlighted |
boolean |
交互状态 |
animation |
LineAnimation |
0 无动画,1~4 为不同流动/脉冲效果 |
animationSpeed |
number |
动画速度倍率 |
fromJunctionPoint / toJunctionPoint |
JunctionPoint |
端点接入位置 |
fontColor / fontSize |
string / number |
文字颜色和大小 |
opacity / isHide |
number / boolean |
透明度和隐藏状态 |
forceDetail |
boolean |
忽略 LOD,始终详情渲染 |
showStartArrow / showEndArrow |
boolean |
是否显示起点/终点箭头 |
data |
any |
业务自定义数据 |
NewNodeData 为 GraphNode 的新增输入(id、text 必填);NewLineData 的 from、to 必填,id 可选。UpdateNodeData 是节点持久化字段的 Partial 类型,不能更新 id、selected、hovered、highlighted;UpdateLineData 不能更新 id,更新端点时必须引用已存在节点。
GraphJsonData 兼容字段
JSON 导入允许使用自身字段,也兼容 relation-graph 字段名。根对象可选 rootId;nodes 与 lines 数组中的字段如下:
| 数据项 | 支持字段 |
|---|---|
| 节点 | id、text、name、x、y、width、height、radius、color、borderColor、borderWidth、fontColor、nodeShape、shape、opacity、isHide、forceDetail、fixed、disabledDrag、icon、flashing、expanded、targetNodes、children、data |
| 连线 | id、from、to、source、target、text、label、color、fontColor、fontSize、lineWidth、lineShape、dashType、style、curve、showEndArrow、showStartArrow、animation、animationSpeed、fromJunctionPoint、toJunctionPoint、opacity、isHide、forceDetail、directed、data |
节点文本优先读取 text,未提供时回退到 name;连线端点支持 from/to 或 source/target。
LayoutOptions
| 字段 | 类型 | 适用布局 | 说明 |
|---|---|---|---|
type |
'force' | 'tree' | 'center' | 'circle' |
全部 | 布局类型 |
iterations |
number |
force | 迭代次数,默认 300 |
repulsion |
number |
force | 节点斥力,默认 5000 |
springLength / springK |
number |
force | 弹簧自然长度/系数 |
damping |
number |
force | 阻尼系数,默认 0.3 |
direction |
TreeDirection |
tree | left / right / top / bottom |
levelDistance |
number | number[] |
tree | 层级间距 |
minPerWidth / maxPerWidth |
number |
tree | 同层节点最小/最大间距 |
fixedRootNode |
boolean |
tree | 是否固定根节点 |
rootIds |
string[] |
tree | 手动指定根节点 ID |
groupThreshold |
number |
tree | 树单元连线分组阈值,默认 5 |
treeGap |
number |
tree | 树之间间距,默认 200 |
startAngle |
number |
center/circle | 起始角度(弧度) |
angleStep |
'auto' | number |
center/circle | 相邻节点角度间距 |
FitViewOptions 与图片导出
FitViewOptions 字段为 nodes、lines(元素对象或 ID 数组)、padding(默认 50)、animate(默认 false)、duration(默认 300ms)和 focus(默认 false)。fitView(80) 是只传边距的简写。
ImageExportOptions 字段为 format(image/png、image/jpeg、image/webp,默认 WebP)、quality(0~1,默认 0.85)、scale(清晰度倍率,默认 2,最高 4)和 viewportSizeMultiplier(当前视口逻辑范围倍率,默认 1)。scale 影响物理像素清晰度,viewportSizeMultiplier 只影响导出范围。
🎨 自定义绘制回调
通过 setCustomDrawCallbacks({ drawNode, drawLine }) 注册回调。回调上下文包含 node/line、屏幕坐标、当前视口缩放、Pixi graphics 对象、drawDefault() 默认绘制方法,以及 draw 工具集。工具集提供 loadImage(url)、drawImage()、drawCircle()、drawRect() 和 drawText();自定义图形创建后需要自行添加到对应容器。
每次调用都会同时替换节点和连线回调:未传入的一侧会被清空,不会沿用上一次的函数。需要保留默认图形时先调用 ctx.drawDefault();两侧都传 undefined 可恢复默认绘制。自定义 drawNode / drawLine 允许依赖外部状态,因此每次渲染都会执行;大图场景应避免在回调中进行昂贵计算。
| 回调 | 上下文关键字段 |
|---|---|
drawNode(ctx: NodeDrawContext) |
screenX、screenY、screenRadius、viewportScale、nodeMode |
drawLine(ctx: LineDrawContext) |
fromScreenX、fromScreenY、toScreenX、toScreenY、lineWidth、lineColor、viewportScale、nodeMode |
📊 性能统计与基础类型
PerfStats 包含 fps、frameTime、renderTime、idle、nodeCount、lineCount、renderedNodeCount、renderedLineCount、renderedTextCount 和字符串形式的 scale。Viewport 为 { x, y, width, height, scale };SelectionBounds 为 { minX, minY, maxX, maxY };CanvasTargetType 为 'node' | 'line' | 'canvas'。
📡 组件事件签名
<TopologyGraph> 当前直接 emits 以下事件:
| 事件 | 参数 |
|---|---|
ready |
(api: GraphApi) |
viewport-change |
(viewport: Viewport) |
selection-change |
(selectedIds: Set<string>) |
selection-box-change |
(nodeIds: string[]) |
node-delete |
(node: GraphNode) |
node-drag-start / node-drag-move / node-drag-end |
(node: GraphNode, event: MouseEvent) |
canvas-drag-start / canvas-drag-move / canvas-drag-end |
(event: MouseEvent) |
canvas-zoom |
(scale: number) |
node-click / node-dblclick |
(node: GraphNode, event: MouseEvent) |
node-hover |
(node: GraphNode | null, event: MouseEvent) |
line-click / line-dblclick |
(line: GraphLine, event: MouseEvent) |
line-hover |
(line: GraphLine | null, event: MouseEvent) |
canvas-click / canvas-contextmenu |
(event, targetType, target?) |
line-draw-start |
(source: GraphNode) |
line-created |
(line: GraphLine, source: GraphNode, target: GraphNode) |
line-draw-cancel |
(source: GraphNode) |
targetType 为 'node'、'line' 或 'canvas'。TopologyEvents 还导出了核心事件总线的类型映射,包含 data-change、perf-stats、history-change、selectionbox-show、selectionbox-close、layout-start、layout-end 和 options-change 等内部生命周期事件;使用 useTopologyGraph() 或 TopologyGraphCore 时可按该类型订阅。
📡 事件示例
组件支持节点、连线、画布、选择、视口和数据等事件:
<TopologyGraph
@node-click="handleNodeClick"
@line-click="handleLineClick"
@line-created="handleLineCreated"
@selection-change="handleSelectionChange"
@canvas-contextmenu="handleContextMenu"
@viewport-change="handleViewportChange"
/>
其中 canvas-contextmenu 的 targetType 为 node、line 或 canvas,可用于区分右键目标。连线绘制相关事件包括:line-draw-start(source)、line-created(line, source, target) 和 line-draw-cancel(source)。
⚡ 性能建议
- 节点数量超过 500 时,优先使用力导向布局并合理调大斥力与节点间距。
- 大数据量场景通过
lodTiers开启分级渲染,缩放较小时使用simple或dot模式。 - 超过 10,000 个节点时,撤销/重做会自动禁用以控制内存占用。
- 使用
forceDetail仅固定关键节点或关键连线,避免大量元素始终以详情模式渲染。 - 默认详细节点会自动复用未变化的形状、图标和文字;使用自定义绘制回调时该缓存不会跳过回调,应把高频计算移出回调或使用
simple/dotLOD。
🧱 非 Vue 场景
import { TopologyGraphCore } from 'topology-graph-vue'
const canvas = document.getElementById('canvas') as HTMLCanvasElement
const graph = await TopologyGraphCore.create(canvas, {
width: 800,
height: 600,
theme: 'light',
})
graph.setJsonData({ nodes: [], lines: [] })
graph.applyLayout({ type: 'force' })
graph.fitView()
📄 License
MIT
Related Packages
A Vue 3 + SVG network topology graph component: node dragging, infinite pan & zo...
Version History
| Version | Released | Vue | License |
|---|---|---|---|
| 1.2.17 | ^3.3.0 || | MIT | |
| 1.2.16 | ^3.3.0 || | MIT | |
| 1.2.15 | ^3.3.0 || | MIT | |
| 1.2.14 | ^3.3.0 || | MIT | |
| 1.2.13 | ^3.3.0 || | MIT | |
| 1.2.12 | ^3.3.0 || | MIT | |
| 1.2.11 | ^3.3.0 || | MIT | |
| 1.2.10 | ^3.3.0 || | MIT | |
| 1.2.9 | ^3.3.0 || | MIT | |
| 1.2.8 | ^3.3.0 || | MIT | |
| 1.2.7 | ^3.3.0 || | MIT | |
| 1.2.6 | ^3.3.0 || | MIT | |
| 1.2.5 | ^3.3.0 || | MIT | |
| 1.2.4 | ^3.3.0 || | MIT | |
| 1.2.3 | ^3.3.0 || | MIT | |
| 1.2.2 | ^3.3.0 || | MIT | |
| 1.2.1 | ^3.3.0 || | MIT | |
| 1.1.2 | ^3.3.0 || | MIT | |
| 1.1.1 | ^3.3.0 || | MIT | |
| 1.1.0 | ^3.3.0 || | MIT | |
| 1.0.9 | ^3.3.0 || | MIT | |
| 1.0.8 | ^3.3.0 || | MIT | |
| 1.0.7 | ^3.3.0 || | MIT | |
| 1.0.6 | ^3.3.0 || | MIT | |
| 1.0.5 | ^3.3.0 || | MIT | |
| 1.0.4 | ^3.3.0 || | MIT | |
| 1.0.3 | ^3.3.0 || | MIT | |
| 1.0.2 | ^3.3.0 || | MIT | |
| 1.0.1 | ^3.3.0 || | MIT | |
| 1.0.0 | ^3.3.0 || | MIT |