topology-graph-vue

基于 PixiJS v8 的高性能 Vue 3 拓扑图组件库,支持 50,000+ 节点以 60 FPS 流畅渲染
5,108
Install
npm install topology-graph-vue
Latest Version:1.2.17
Vue:3
License:MIT
Last Updated:Sep 22, 2026
Links: Gitee  ·  npm
Maintainer: guangyoucai

🕸️ 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 / dot LOD。

🧱 非 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

vue3-network-graph

A Vue 3 + SVG network topology graph component: node dragging, infinite pan & zo...

1,236
@mx-sose-front/mx-sose-graph

A Vue3 graph visualization plugin library

7,983
@yamakox/vue3-plotly

A Vue 3 wrapper component for Plotly.js

2,077 1
@litt1e-p/graphi

a high performance d3.js graph tree data visualization

385 1
vue-d3-network

Vue component to graph networks using d3-force

40,415 527

Version History

Version Released Vue License
1.2.17 ^3.3.0 || ^3.4.0 || ^3.5.0 MIT
1.2.16 ^3.3.0 || ^3.4.0 || ^3.5.0 MIT
1.2.15 ^3.3.0 || ^3.4.0 || ^3.5.0 MIT
1.2.14 ^3.3.0 || ^3.4.0 || ^3.5.0 MIT
1.2.13 ^3.3.0 || ^3.4.0 || ^3.5.0 MIT