从 G6 3.0.x 版本升级到 3.1.0 版本时的注意事项。

不再支持 nodeStyle 和 edgeStyle

G6 3.1 版本中实例化 Graph 时,新增了 **nodeStateStyles** 及 **edgeStateStyles** 两个配置项,删除了 nodeStyle 和 edgeStyle ,使用 3.1 以下版本的同学,只需要将 nodeStyle 改成 nodeStateStyles ,将 edgeStyle 改成 edgeStateStyles ,配置写法上稍有变化。

旧的写法

G6 3.1.0 版本之前的写法是,初始的状态既可以在 defaultNode、defaultEdge 中通过 style 定义,也可以在 nodeStyle 和 edgeStyle 中通过 default 定义,交互状态和业务状态在 nodeStyle 和 edgeStyle 中通过 styles 来定义。这样在使用中就会造成一定的困扰,究竟该使用哪种方式,styles 又是什么意思?开发者就会产生很大疑惑。

  1. const graph = new G6.TreeGraph({
  2. container: 'mountNode',
  3. width: 1000,
  4. height: 800,
  5. defaultNode: {
  6. size: 16,
  7. anchorPoints: [[0, 0.5], [1, 0.5]]
  8. },
  9. defaultEdge: {
  10. shape: 'cubic-horizontal'
  11. },
  12. nodeStyle: {
  13. default: {
  14. fill: '#40a9ff',
  15. stroke: '#096dd9'
  16. },
  17. styles: {
  18. hover: {
  19. opacity: 0.6
  20. }
  21. }
  22. },
  23. edgeStyle: {
  24. default: {
  25. stroke: '#A3B1BF'
  26. },
  27. styles: {
  28. hover: {
  29. opacity: 0.6
  30. }
  31. }
  32. }
  33. });

新的写法

G6 3.1.0 版本中,统一了定义的方式:

  • 默认的样式在 defaultNode 和 defaultEdge 中通过 style 定义;
  • hover、 selected 等交互和业务状态在 nodeStateStyles 和 edgeStateStyles 中定义。

这样一来就很明显了,也不会产生不必要的疑惑和困扰。

  1. const graph = new G6.Graph({
  2. container: 'mountNode',
  3. width: 1000,
  4. height: 600,
  5. defaultNode: {
  6. size: 16,
  7. anchorPoints: [[0, 0.5], [1, 0.5]]
  8. style: {
  9. fill: '#40a9ff',
  10. stroke: '#096dd9'
  11. }
  12. },
  13. defaultEdge: {
  14. shape: 'cubic-horizontal'
  15. style: {
  16. stroke: '#A3B1BF'
  17. }
  18. },
  19. nodeStateStyles: {
  20. hover: {
  21. opacity: 0.6
  22. }
  23. },
  24. edgeStateStyles: {
  25. hover: {
  26. opacity: 0.6
  27. }
  28. }
  29. });

示例代码请参考鼠标操作高亮节点。

自定义节点和边

基于内置节点自定义

基于内置节点自定义时,如果只需要修改内置节点的部分参数,G6 3.1.0 版本新增了 getCustomConfig() 方法,方便复用内置的节点,用户可以通过以下方式实现。

  1. G6.registerNode('myCircle', {
  2. getCustomConfig(cfg) {
  3. return {
  4. style: {
  5. lineWidth: 2
  6. },
  7. labelCfg: {
  8. style: {
  9. fill: '#595959'
  10. },
  11. offset: 10
  12. },
  13. stateStyles: {
  14. // 鼠标hover状态下的配置
  15. hover: {
  16. fillOpacity: 0.6
  17. },
  18. // 选中节点状态下的配置
  19. selected: {
  20. lineWidth: 1
  21. }
  22. }
  23. }
  24. }
  25. }, 'circle')

更多关于基于内置节点的自定义的内容及使用方法,请参考内置元素文档。

完全自定义

自定义节点和边时,建议将所有默认配置存储到 options 对象中,不要使用硬编码。

  1. G6.registerNode('myCircle', {
  2. // 自定义节点时的配置
  3. options: {
  4. size: 60,
  5. style: {
  6. stroke: Global.defaultShapeStrokeColor,
  7. fill: Global.defaultShapeFillColor,
  8. lineWidth: 1
  9. },
  10. labelCfg: {
  11. style: {
  12. fill: '#595959'
  13. },
  14. offset: 0
  15. },
  16. stateStyles: {
  17. // 鼠标hover状态下的配置
  18. hover: {
  19. fillOpacity: 0.8
  20. },
  21. // 选中节点状态下的配置
  22. selected: {
  23. lineWidth: 3
  24. }
  25. }
  26. },
  27. shapeType: 'circle',
  28. // 文本位置
  29. labelPosition: 'center',
  30. drawShape(cfg, group) {}
  31. }

更多关于完全自定义节点的内容及使用方法,请参考自定义节点文档、自定义边文档。

使用布局

G6 3.1.0 版本新增了 random, radial, mds, circular, fruchterman, force, dagre 共 7 种内置布局,开发者可以直接使用内置的布局。另外,还支持布局方法的动态切换、布局参数的动态切换、数据动态切换时布局的更新等。

  1. const graph = new G6.Graph({
  2. ... // 其他配置项
  3. // Object,布局方法及其配置项,若不配置 layout 则默认为使用数据中的位置信息布局或使用 random 布局。
  4. layout: {
  5. type: 'force', // 指定使用力导向布局
  6. preventOverlap: true, // 力导向布局的配置项
  7. nodeSize: 30, // 力导向布局的配置项
  8. ... // 其他配置
  9. }
  10. });
  11. // 动态切换布局或切换布局参数
  12. graph.updateLayout({
  13. // ...
  14. });
  15. // 动态图数据时自动更新布局
  16. graph.changeData(newData);

更多关于布局的内容及使用方法,请参考Layout文档;API请参考Layout API;示例代码请参考力导向图布局、环形布局参数切换。

自定义布局

G6 3.1.0 不仅支持使用上述内置布局,还支持用户自定义布局。用户可以通过 G6.registerLayout() 复写获取默认配置项方法 getDefaultCfg() 和布局执行方法 execute() 进行布局的自定义。

  1. G6.registerLayout('myLayout', {
  2. getDefaultCfg: function getDefaultCfg() {
  3. return {
  4. // TODO 默认配置项
  5. };
  6. },
  7. execute: function execute() {
  8. // TODO 布局方法
  9. }
  10. });

更多关于自定义布局的内容及使用方法,请参考自定义布局教程,API请参考Layout API,示例代码请参考自定义布局-Bigraph。