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

不再支持 nodeStyleedgeStyle

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

旧的写法

G6 3.1.0 版本之前的写法是,初始的状态既可以在 defaultNodedefaultEdge 中通过 style 定义,也可以在 nodeStyleedgeStyle 中通过 default 定义,交互状态和业务状态在 nodeStyleedgeStyle 中通过 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 版本中,统一了定义的方式:

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

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

  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