--- title: 节点总览 order: 0 --- ## 什么是节点 节点(Node)是图中的基本元素之一,表示图中的实体或者抽象概念,例如一个人、一个地点、一个组织等,节点可以包含一些属性,例如节点的 ID、名称、类型等。在 G6 中,节点可以具有多种形状和样式,并支持丰富的交互和自定义功能。 你可以在图中创建任意数量的节点,并通过边连接它们以表示关系。 ## 节点体系 G6 的节点体系包括三大类:内置节点、扩展节点和自定义节点。**大多数场景下,内置节点即可满足需求**。 ### 内置节点 G6 提供了丰富的内置节点类型,**无需注册,直接配置即可使用**: | 节点类型 | 注册名称 | 描述 | | ---------- | ---------- | ------------------------ | | 圆形节点 | `circle` | 常用于表示普通实体 | | 矩形节点 | `rect` | 适合展示更多文本和细节 | | 椭圆节点 | `ellipse` | 类似圆形的变体 | | 菱形节点 | `diamond` | 常用于决策点或特殊节点 | | 三角形节点 | `triangle` | 可用于指示方向或特殊标记 | | 六边形节点 | `hexagon` | 适合网格布局和蜂窝图 | | 星形节点 | `star` | 突出显示重要节点 | | 甜甜圈节点 | `donut` | 可展示比例或进度信息 | | 图片节点 | `image` | 使用图片作为节点主体 | | HTML节点 | `html` | 支持自定义HTML内容 | ### 3D 节点 `@antv/g6-extension-3d` 提供了 3D 节点: - `Capsule` - 胶囊型节点 - `Cone` - 圆锥型节点 - `Cube` - 立方体节点 - `Cylinder` - 圆柱型节点 - `Plane` - 平面节点 - `Sphere` - 球体节点 - `Torus` - 圆环节点 ### React 节点 `@antv/g6-extension-react` 提供了 React 节点,支持使用 React 组件作为节点的主体,详细教程请查看 [使用 React 定义节点](/manual/element/node/react-node) 文档。 ### 自定义节点 当内置节点和扩展节点无法满足需求时,G6提供了强大的自定义能力: - 继承内置节点进行扩展 - 创建全新的节点类型 与内置节点不同,**自定义节点需要先注册后使用**。详细教程请参考 [自定义节点](/manual/element/node/custom-node) 文档。 ## 数据结构 定义节点时,需要在图的数据对象中添加 `nodes` 字段。每个节点是一个对象,结构如下: | 属性 | 描述 | 类型 | 默认值 | 必选 | | -------- | -------------------------------------------------------------------------------------------- | -------------- | ------ | ---- | | id | 节点的唯一标识符,用于区分不同的节点 | string | - | ✓ | | type | 节点类型,内置节点类型名称或者自定义节点的名称 | string | - | | | data | 节点数据,用于存储节点的自定义数据,例如节点的名称、描述等。可以在样式映射中通过回调函数获取 | object | - | | | style | 节点样式,包括位置、大小、颜色等视觉属性 | object | - | | | states | 节点初始状态,如选中、激活、悬停等 | string[] | - | | | combo | 所属的组合 ID,用于组织节点的层级关系,如果没有则为 null | string \| null | - | | | children | 子节点 ID 集合,仅在树图场景下使用 | string[] | - | | `nodes` 数组中一个数据项的示例: ```json { "id": "node-1", "type": "circle", "data": { "name": "alice", "role": "Admin" }, "style": { "x": 100, "y": 200, "size": 32, "fill": "violet" }, "states": ["selected"], "combo": null } ``` ## 配置方法 配置节点的方式有三种,按优先级从高到低如下: - 使用 `graph.setNode()` 动态配置 - 实例化图时全局配置 - 在数据中动态属性 这几个配置方法可以同时使用。有相同的配置项时,优先级高的方式将会覆盖优先级低的。 ### 使用 `graph.setNode()` 可在图实例创建后,使用 `graph.setNode()` 动态设置节点的样式映射逻辑。 该方法需要在 `graph.render()` 之前调用才会生效,并拥有最高优先级。 ```js graph.setNode({ style: { type: 'circle', style: { size: 60, fill: '#7FFFD4', stroke: '#5CACEE', lineWidth: 2 }, }, }); graph.render(); ``` ### 实例化图时全局配置 在实例化图时可以通过 `node` 配置节点样式映射,这里的配置是全局的配置,将会在所有节点上生效。 ```js import { Graph } from '@antv/g6'; const graph = new Graph({ node: { type: 'circle', style: { size: 60, fill: '#7FFFD4', stroke: '#5CACEE', lineWidth: 2 }, }, }); ``` ### 在数据中动态配置 如果需要为不同节点进行不同的配置,可以将配置写入到节点数据中。这种配置方式可以通过下面代码的形式直接写入数据: ```typescript const data = { nodes: [ { id: 'node-1', type: 'circle', style: { size: 60, fill: '#7FFFD4', stroke: '#5CACEE', lineWidth: 2 }, }, ], }; ``` ### 调整优先级 如果你想让数据中配置的优先级高于全局配置,你可以采取以下方式: ```js 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, }, }, }); ``` ### 动态更新节点 G6 支持在运行时动态更新节点的样式和状态: ```typescript // 更新单个节点样式 graph.updateNodeData([ { id: 'node-1', style: { fill: 'red', size: 80, }, }, ]); graph.draw(); // 设置节点状态 graph.setElementState('node-1', ['selected']); ``` :::warning{title=注意} 更新节点时,只有指定的属性会被更新,未指定的属性保持不变。 ::: 更多与节点相关的 API 请参考 [API - 元素操作](/api/element)。 ## 节点状态 节点可以拥有不同的状态,例如选中、高亮、禁用等。可以通过配置状态样式来定义节点在不同状态下的显示效果: ```typescript const graph = new Graph({ node: { style: { // 默认样式 fill: '#C6E5FF', }, // 状态样式 state: { selected: { fill: '#ffa940', stroke: '#ff7a00', haloStroke: '#ff7a00', }, highlight: { stroke: '#1890ff', lineWidth: 3, }, }, }, }); ``` 状态系统是实现节点交互效果的基础,更多状态的介绍,请参考 [元素状态](/manual/element/state)。