G6 节点体系完全指南:内置节点、数据模型与配置优先级机制 数据可视化前端图表库【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址https://gitcode.com/gh_mirrors/g6/G6点击查看免费下载节点Node是图可视化中最基础、最核心的元素之一。本文以 G6JavaScript 图可视化框架的节点模块为线索系统讲解内置节点的种类与用法、节点数据模型、三种配置方式的优先级关系、运行时动态更新以及状态系统并结合仓库源码packages/g6/src/elements/nodes、packages/g6/src/registry、packages/g6/src/runtime/graph.ts等剖析底层实现帮助你快速掌握 G6 节点的选型、配置与扩展能力。什么是节点在 G6 中节点是图Graph的基本元素之一用于表示一个实体或抽象概念例如一个人、一个地点、一个组织、一台服务器等。节点可以携带id唯一标识、name名称、type类型等属性在视觉层面节点拥有多种形状与样式并支持丰富的交互与自定义能力。你可以在一个图中创建任意数量的节点并通过边Edge将它们连接起来从而表达实体之间的关联关系。节点、边、组合Combo共同构成了 G6 的数据与渲染模型。节点系统总览内置、扩展与自定义三层体系G6 的节点系统包含三大类别内置节点Built-in Nodes、扩展节点Extended Nodes与自定义节点Custom Nodes。在大多数场景下内置节点已经足够使用无需任何额外注册即可直接上手。内置节点开箱即用的 10 种类型G6 内置了 10 种节点类型无需注册即可直接使用节点类型注册名称适用场景圆形节点circle通用实体表示最常用矩形节点rect需要承载更多文字与细节信息椭圆节点ellipse圆形的变体菱形节点diamond常用于决策点或特殊节点三角形节点triangle可表示方向或特殊标记六边形节点hexagon适合网格布局与蜂窝图星形节点star突出显示重要节点环形节点donut可展示占比或进度信息图片节点image以图片作为节点主体HTML 节点html支持自定义 HTML 内容从源码看无需注册 的实现机制在 内置扩展注册表node分类下注册了circle、diamond、ellipse、hexagon、html、image、rect、star、donut、triangle共 10 个内置节点类项目导入时由 preset.ts 调用registerBuiltInExtensions()完成自动注册因此应用侧无需手动register。10 个节点的类实现均位于 节点源码目录其中circle、rect等几何节点继承自BaseNode基类html节点则基于 G 的 HTML 图形实现。3D 节点来自antv/g6-extension-3dantv/g6-extension-3d扩展包提供了 3D 场景下的立体节点共 7 种Capsule胶囊体Cone圆锥体Cube立方体Cylinder圆柱体Plane平面Sphere球体Torus圆环体这些 3D 节点类统一导出自 3D 扩展节点入口全部继承自BaseNode3D基于antv/g-plugin-3d的过程化几何体ProceduralGeometry生成网格。以 球体节点实现 为例其默认样式为size: 24、latitudeBands: 16、longitudeBands: 16可通过size直接控制球体半径也可在样式中指定radius覆盖默认半径。React 节点来自antv/g6-extension-reactantv/g6-extension-react扩展包提供 React 节点支持直接将 React 组件作为节点主体进行渲染。其入口 react 扩展源码 导出了ReactNode、render、unmount等核心能力。详细教程请参阅 使用 React 定义节点 文档。自定义节点按需注册的扩展能力当内置节点与扩展节点都无法满足需求时G6 提供两种自定义路径继承内置节点进行扩展例如在Rect基础上添加副标题从零创建全新节点类型基于 G 底层图形系统。与内置节点不同自定义节点在使用前必须注册。注册通过registerAPI 完成例如import { register, BaseNode, ExtensionCategory } from antv/g6; class CircleNode extends BaseNode {} register(ExtensionCategory.NODE, circle-node, CircleNode);register的实现位于 register.ts将节点类写入扩展注册表EXTENSION_REGISTRY若同名类型已存在会打印覆盖警告。自定义节点只注册一次即可在全项目任意位置通过type引用。详细教程请参阅 自定义节点 文档。节点数据结构详解定义节点时需要在图的数据对象中添加nodes字段。每个节点是一个对象其结构如下表属性说明类型默认值必填id节点的唯一标识用于区分不同节点string-✓type节点类型可为内置节点类型名或自定义节点名string-data节点数据存储自定义数据如名称、描述等可在样式映射回调中访问object-style节点样式包含位置、尺寸、颜色等视觉属性object-states节点的初始状态如selected、active、hover等string[]-combo节点所属 Combo 的 ID用于组织层级关系无则设为nullstring \| null-children子节点 ID 集合仅用于树图tree graph场景string[]-nodes数组中一个数据项的完整示例{ id: node-1, type: circle, data: { name: alice, role: Admin }, style: { x: 100, y: 200, size: 32, fill: violet }, states: [selected], combo: null }上述字段与源码中 NodeData 类型定义 一一对应。从类型定义可以看出除文档表格列出的字段外NodeData还额外支持depth节点深度仅树图场景字段并允许[key: string]: unknown索引签名——这意味着你可以在节点数据中自由追加业务字段它们会被原样保留供样式映射回调读取。节点的三种配置方式与优先级G6 提供三种节点配置方式按优先级从高到低排列使用graph.setNode()进行动态配置最高优先级图实例化时的全局配置node字段数据中的动态属性最低优先级。这三种方式可以同时使用当存在相同配置项时高优先级方式会覆盖低优先级方式。方式一使用graph.setNode()最高优先级在图实例创建之后、graph.render()之前可以调用graph.setNode()动态设置节点的样式映射逻辑。该方法必须在render()之前调用才能生效并且拥有最高优先级graph.setNode({ style: { type: circle, style: { size: 60, fill: #7FFFD4, stroke: #5CACEE, lineWidth: 2 }, }, }); graph.render();从源码看setNode的实现在 graph.ts#L215-L218它将传入的NodeOptions写入this.options.node并触发context.model.refreshData()刷新数据模型。此外graph.setOptions()内部也会在检测到node配置时调用setNode见 graph.ts#L146因此两种入口最终走向同一套逻辑。方式二图实例化时的全局配置实例化 Graph 时可以通过node字段配置节点样式映射这是一份全局配置将应用于所有节点import { Graph } from antv/g6; const graph new Graph({ node: { type: circle, style: { size: 60, fill: #7FFFD4, stroke: #5CACEE, lineWidth: 2 }, }, });node字段的类型即 NodeOptions除了type与style之外还支持state状态样式、animation动画配置与palette色板三个可选配置项style既可以是静态对象也可以是接收节点数据data的回调函数支持逐属性回调这一设计为按数据驱动样式提供了基础。方式三数据中的动态配置如果需要对不同节点做差异化配置可以把配置直接写进节点数据。这种配置方式可以直接以如下形式写入数据const data { nodes: [ { id: node-1, type: circle, style: { size: 60, fill: #7FFFD4, stroke: #5CACEE, lineWidth: 2 }, }, ], };调整优先级让数据配置高于全局配置默认情况下全局配置的优先级高于数据内配置。如果你希望数据中的配置覆盖全局配置可以借助回调函数实现——在全局样式中通过(d) d.style.xxx || fallback的形式降级为数据优先const data { nodes: [ { id: node-1, type: circle, style: { size: 60, fill: #7FFFD4, stroke: #5CACEE, lineWidth: 2 }, }, ], }; const graph new Graph({ node: { type: circle, style: { stroke: (d) d.style.stroke || #5CACEE, lineWidth: 2, }, }, });这里stroke被写成回调函数优先取当前节点数据中的stroke取不到时才回退到默认色值从而实现了数据优先于全局的效果。回调函数的入参即节点数据项因此你也可以读取d.data.xxx等自定义业务字段。运行时动态更新节点G6 支持在运行时动态更新节点的样式与状态// 更新单个节点的样式 graph.updateNodeData([ { id: node-1, style: { fill: red, size: 80, }, }, ]); graph.draw(); // 设置节点状态 graph.setElementState(node-1, [selected]);:::warning{title注意} 更新节点时只更新指定的属性未指定的属性将保持不变。 :::updateNodeData的实现在 graph.ts#L847-L851它接受部分节点数据PartialNodeLikeData或回调函数——只需传入需要更新的字段无需传入完整数据这也是上述未指定属性保持不变特性的来源。更多节点相关 API 请参阅 API - 元素操作。节点状态系统节点可以拥有不同状态如选中selected、高亮highlight、禁用disabled等。你可以通过配置state样式定义节点在不同状态下的展示效果const graph new Graph({ node: { style: { // 默认样式 fill: #C6E5FF, }, // 状态样式 state: { selected: { fill: #ffa940, stroke: #ff7a00, haloStroke: #ff7a00, }, highlight: { stroke: #1890ff, lineWidth: 3, }, }, }, });状态系统是实现节点交互效果的基础。G6 内置了selected、active、highlight、inactive、disabled等常用状态也完全支持自定义状态名多个状态可以共存状态样式按设置的先后顺序叠加后设置者优先。动态设置状态使用graph.setElementState其重载实现在 graph.ts#L1803-L1835graph.setElementState(id, state)设置单个元素的状态graph.setElementState({ id1: [...], id2: [...] })批量设置多个元素的状态内部会识别元素类型为节点/边/组合再写入对应数据并触发重绘。更完整的元素状态配置、内置状态说明、状态叠加与清除方法请参阅 元素状态文档。从源码理解节点的构成与扩展BaseNode节点的通用骨架所有内置节点都继承自抽象基类BaseNodebase-node.ts。从源码可以清晰看到节点的复合结构——一个节点由key主体图形、halo光晕、icon图标、badges徽标、label标签、ports连接桩六个部分组成render()方法按key → halo → icon → badges → label → ports的顺序依次绘制见 base-node.ts#L407-L426。BaseNode还定义了丰富的默认样式见 base-node.ts#L197-L225例如size: 32、label: true标签默认显示放置于底部labelPlacement: bottom、halo: false光晕默认关闭haloLineWidth: 12、haloStrokeOpacity: 0.25、icon: true、port: true等。自定义节点时以BaseNode为基类只需实现drawKeyShape即可复用整套标签、图标、徽标与连接桩能力。各内置节点的源码特色Circlecircle.ts默认size: 32通过r: Math.min(...getSize(attributes)) / 2将size转换为半径图标尺寸按ICON_SIZE_RATIO比例缩放。仓库中的 圆形节点示例 展示了iconText、回调式labelText: (d) d.id!与size: 40的典型组合。Rectrect.ts将size解析为[width, height]并以x: -width / 2, y: -height / 2实现中心对齐。Imageimage.ts通过img或其别名src指定图片来源默认size: 32。HTMLhtml.ts默认尺寸为[160, 80]默认关闭halo、icon、label支持innerHTML、dx/dy偏移与pointerEvents控制。Donut环形节点通过donuts数组配置多个环形扇区每个扇区支持color、value、lineWidth等并可用innerR: 60%控制内径比例环形节点示例 演示了扇区、状态样式与donutLineWidth、donutStroke的搭配。快速上手一个最小节点图结合三种配置方式一个最小可运行的节点图大致如下import { Graph } from antv/g6; const graph new Graph({ container: container, data: { nodes: [{ id: node-1 }, { id: node-2 }], edges: [{ source: node-1, target: node-2 }], }, node: { type: circle, style: { size: 32, labelText: (d) d.id }, }, }); graph.render();总结G6 的节点体系由内置节点10 种免注册、扩展节点3D 7 种、React 节点与自定义节点需注册三部分组成大多数场景下内置节点即可覆盖需求节点数据模型以id为唯一标识type、data、style、states、combo、children等字段与源码 NodeData 类型严格对应三种配置方式的优先级为graph.setNode() 实例化全局node配置 数据内配置且可通过回调函数调整数据与全局配置的优先级运行时更新使用updateNodeData()部分更新未指定属性保持不变与setElementState()状态设置/清除/批量操作节点由 key/halo/icon/badges/label/ports 六层复合而成理解 BaseNode 的渲染顺序与默认样式是自定义节点的重要起点。进一步阅读元素状态、自定义节点、React 节点、Vue 节点、元素操作 API。赞分享数据可视化前端图表库【免费下载链接】G6♾ A Graph Visualization Framework in JavaScript.项目地址https://gitcode.com/gh_mirrors/g6/G6点击查看免费下载相关推荐G6 节点Node体系全解析内置类型、数据结构与样式配置实战G6 节点Node体系全解析内置类型、数据结构与样式配置实战 节点是图可视化中最核心的构成单元。本文以 G6 官方文档《节点总览》为主线结合 G6 仓库数据可视化前端图表库G6 Donut 节点甜甜圈节点完全指南配置参数、数据驱动与源码实现解析G6 Donut 节点甜甜圈节点完全指南配置参数、数据驱动与源码实现解析 本文聚焦 AntV G6 内置的 Donut甜甜圈节点系统讲解其适用场景、数据可视化前端图表库G6 边Edge完全指南内置类型、数据结构与配置优先级解析G6 边Edge完全指南内置类型、数据结构与配置优先级解析 本文围绕图可视化框架 G6 中边Edge这一基础元素展开系统讲解边的概念与方向性、六数据可视化前端图表库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考