g6/packages/site/docs/manual/customize/extensionCats.zh.md

19 KiB
Raw Blame History

title order
自定义扩展总览 0

API 文档中,您可以看到 G6 提供了丰富的内置功能基本能够满足大多数业务诉求。当内置的能力无法满足时G6 还提供了自由的扩展机制您可以根据业务需求自定义各个种类的扩展。G6 5.0 与以往版本在架构上的最大不同在于它的全开放性,除了 Graph 本身以外,其他能力都是 G6 的“扩展Extensions例如节点类型的内置扩展有 'circle-node', 'rect-node' 等,交互的内置扩展有 'drag-node', 'zoom-canvas' 等且各个类型的扩展在写法上保持内置和自定义一致。因此您可以参考任意内置的源码进行继承和扩展。G6 5.0 的扩展分类为:

  • 节点类型
  • 边类型
  • combo 类型
  • 数据转换器
  • 交互
  • 布局算法
  • 插件
  • 主题

对于上述几种扩展G6 已经提供了丰富内置功能,但大多数并没有默认注册到 Graph 上。这是因为我们希望在打包时实现 TreeShaking 减少包体积。因此,部分内置功能在使用时从 Extensions 引入并需要通过 extend 方法注册到 Graph 后再配置到图实例上进行使用,下面以未默认注册的几个内置功能 ellipse-node, diamond-node, cubic-edge, lasso-select, map-node-size 为例:

import { Graph as BaseGraph, extend, Extensions } from '@antv/g6';

/**
 * 扩展 Graph注册需要使用的内置功能第二个参数是注册表
 * */
const Graph = extend(BaseGraph, {
  nodes: {
    'ellipse-node': Extensions.EllipseNode,
    'diamond-node': Extensions: DiamondNode,
  },
  edges: {
    'cubic-edge': Extensions.CubicEdge,
  },
  transforms: {
    'map-node-size':Extensions.MapNodeSize,
  },
  behaviors: {
    'lasso-select': Extensions.LassoSelect
  }
});

// 使用扩展后的类进行实例化
const graph = new Graph({
  // ... 其他配置
  transforms: [{ type: 'map-node-size', field: 'degree' range: [16, 60]}],
  node: model => {
    return {
      id: model.id,
      data: {
        type: model.data.value > 10 ? 'diamond-node' : 'ellipse-node',
        // ... 其他配置
      }
    }
  },
  edge: {
    type: 'cubic-edge',
  },
  modes: {
    default: ['lasso-select']
  }
});

内置的扩展

这里列举 G6 内置的扩展,以及是否默认注册:

1. 节点类型nodes

type 名称 引入方式 是否默认注册 Demo 注释
'circle-node' Extensions.CircleNode DEMO
'rect-node' Extensions.RectNode 矩形 DEMO圆角矩形 DEMO
'image-node' Extensions.ImageNode DEMO
'donut-node' Extensions.DonutNode DEMO
'diamond-node' Extensions.DiamondNode DEMO
'hexagon-node' Extensions.HexagonNode DEMO
'star-node' Extensions.StarNode DEMO
'triangle-node' Extensions.TriangleNode DEMO
'ellipse-node' Extensions.EllipseNode DEMO
'modelRect-node' Extensions.ModelRectNode DEMO
'sphere-node' Extensions.SphereNode DEMO 仅在 renderer: 'webgl-3d' 时可使用
'cube-node' Extensions.CubeNode DEMO 仅在 renderer: 'webgl-3d' 时可使用

2. 边类型edges

type 名称 引入方式 是否默认注册 Demo 注释
'line-edge' Extensions.LineEdge DEMO
'loop-edge' Extensions.LineEdge DEMO
'quadratic-edge' Extensions.QuadraticEdge DEMO
'cubic-edge' Extensions.CubicEdge DEMO
'polyline-edge' Extensions.PolylineEdge DEMO
'cubic-horizontal-edge' Extensions.CubicHorizontalEdge DEMO
'cubic-vertical-edge' Extensions.CubicVerticalEdge DEMO

3. Combo 类型 (combos)

type 名称 引入方式 是否默认注册 Demo 注释
'circle-combo' Extensions.CircleCombo DEMO
'rect-combo' Extensions.RectCombo DEMO

4. 数据转换器 (transforms)

用于处理数据,在原始数据输入图后被调用。若有多个,按其配置的数组顺序执行)。

type 名称 引入方式 是否默认注册 Demo 注释
'transform-v4-data' Extensions.TransformV4Data
'map-node-size' Extensions.MapNodeSize

5. 交互 (behaviors)

所有内置、自定义交互应当继承 Extensions.BaseBehavior 或其他已有的交互。

type 名称 引入方式 是否默认注册 Demo 注释
'drag-canvas' Extensions.DragCanvas DEMO
'zoom-canvas' Extensions.ZoomCanvas DEMO
'drag-node' Extensions.DragNode DEMO
'drag-combo' Extensions.DragCombo DEMO
'click-select' Extensions.ClickSelect DEMO
'collapse-expand-combo' Extensions.CollapseExpandCombo DEMO
'collapse-expand-tree' Extensions.CollapseExpandTree DEMO
'activate-relations' Extensions.ActivateRelations DEMO
'brush-select' Extensions.BrushSelect DEMO
'lasso-select' Extensions.LassoSelect DEMO
'create-edge' Extensions.CreateEdge DEMO
'shortcuts-call' Extensions.ShortcutsCall DEMO
'scroll-canvas' Extensions.ScrollCanvas DEMO
'orbit-canvas-3d' Extensions.OrbitCanvas3D DEMO 仅在 renderer: 'webgl-3d' 时可使用
'zoom-canvas-3d' Extensions.ZoomCanvas3D DEMO 仅在 renderer: 'webgl-3d' 时可使用

5. 布局算法 (layouts)

type 名称 引入方式 是否默认注册 Demo 注释
'force' Extensions.ForceLayout DEMO
'grid' Extensions.GridLayout DEMO
'circular' Extensions.CircularLayout DEMO
'concentric' Extensions.ConcentricLayout DEMO
'random' Extensions.RandomLayout
'mds' Extensions.MDSLayout DEMO
'radial' Extensions.RadialLayout DEMO
'fruchterman' Extensions.FruchtermanLayout DEMO
'd3-force' Extensions.D3ForceLayout
'force-atlas-2' Extensions.ForceAtlas2Layout DEMO
'dagre' Extensions.DagreLayout DEMO
'comboCombined' Extensions.ComboCombinedLayout DEMO
'compactBox' Extensions.compactBox DEMO
'dendrogram' Extensions.compactBox DEMO
'indented' Extensions.compactBox DEMO
'mindmap' Extensions.mindmap DEMO

6. 插件 (plugins)

所有内置、自定义插件应当继承 Extensions.BasePlugin 或其他已有的插件。

type 名称 引入方式 是否默认注册 Demo 注释
'history' Extensions.History DEMO
'toolbar' Extensions.Toolbar DEMO
'tooltip' Extensions.Tooltip DEMO
'minimap' Extensions.Minimap DEMO
'grid' Extensions.Grid DEMO
'menu' Extensions.Menu DEMO
'fisheye' Extensions.Fisheye DEMO
'legend' Extensions.Legend DEMO
'timebar' Extensions.Timebar DEMO
'hull' Extensions.Hull DEMO
'snapline' Extensions.Snapline DEMO
'watermarker' Extensions.WaterMarker DEMO 支持图片或多文本

自定义扩展

上文介绍了内置扩展的注册方法。自定义的扩展注册与内置扩展注册方式一致:

import { Graph as BaseGraph, extend, Extensions } from '@antv/g6';

// 自定义节点类型,继承一个已有的节点类型或节点基类 Extensions.BaseNode
class XXCustomNode extends Extensions.CircleNode {
  // ... 自定义节点逻辑,写法见自定义节点文档
}

// 自定义交互,继承一个已有的交互或交互基类 Extensions.BaseBehavior
class XXCustomBehavior extends Extensions.BaseBehavior {
  // ... 自定义交互逻辑,写法见自定义交互文档
}
/**
 * 注册需要使用的内置功能,第二个参数是注册表。可同时注册内置扩展和自定义扩展
 * */
const Graph = extend(BaseGraph, {
  nodes: {
    'xx-custom-node': XXCustomNode,
  },
  behaviors: {
    'lasso-select': Extensions.LassoSelect
    'xx-custom-behavior': XXCustomBehavior
  }
  // ..其他扩展的注册同理
});

const graph = new Graph({
  // ... 其他配置
  node: {
    type: 'xx-custom-node', // 使用注册表中的 key 进行配置
  },
  modes: {
    default: ['drag-canvas', 'lasso-select', 'xx-custom-behavior']
  }
});

每种扩展应当继承对应的扩展基类,或已有的同类扩展。各个类型扩展的写法参见本章节的后续文档。