image.png

前言

小程序已经触达到了生活中的方方面面,随着业务需求的爆发增长,在小程序内绘制关系图的诉求也越来越多。然而业界还缺少支持小程序的图可视化引擎,很多小程序内依旧通过嵌套 webview 的方式进行展示,这在性能和体验上都存在很多问题。G6 团队实现了支持小程序的版本,同时针对移动端特性做了很多适配,让关系图在小程序中表现更好,操作更顺滑,助力小程序完成更多不可能的事情。同时,G6 的小程序版本做了大量适配工作,可以让 web 版以最小的成本迁移到小程序。

G6基础

阅读本文前,我们默认你有G6的使用经验,如果对G6没有任何概念,建议先移步 什么是G6

定个小目标

本文会带你在10min内快速在小程序内绘制下面这个关系图,通过一个简单的实例带你进入小程序的图世界。
image.png

开始小目标

image.png

当然你首先得有一个小程序ide
image.png

image.png

image.png

引入npm包

⚠️ 目前版本为beta,请谨慎用于生产环境,3月底我们会对外发布release版本

  1. npm install --save @antv/g6-mobile@0.0.1-beta.1

image.png

创建canvas元素

编辑 pages/index/index.axml ,增加一个canvas元素。

  1. <view>
  2. <canvas
  3. id="canvas"
  4. style="
  5. height: {{canvasHeight - 110}}px;
  6. width: {{canvasWidth}}px;
  7. "
  8. disable-scroll="{{false}}"
  9. onTouchStart="ontouch"
  10. onTouchCancel="ontouch"
  11. onTouchMove="ontouch"
  12. onTouchEnd="ontouch"
  13. ></canvas>
  14. </view>

G6-Mobile基于canvas实现,所以需要有一个canvas实例用来绘制关系图。由于小程序无法动态创建事件监听,所以需要通过 onTouchStart="ontouch" 的形式对事件进行捕获,并在js中透传给G6做处理。

准备数据

创建 pages/index/data.js 用于保存数据,下面这份数据主要描述了17个节点和连接关系,具体可以参考这里

  1. export default {
  2. nodes: [
  3. { id: 'node0', size: 50 },
  4. { id: 'node1', size: 30 },
  5. { id: 'node2', size: 30 },
  6. { id: 'node3', size: 30 },
  7. { id: 'node4', size: 30, isLeaf: true },
  8. { id: 'node5', size: 30, isLeaf: true },
  9. { id: 'node6', size: 15, isLeaf: true },
  10. { id: 'node7', size: 15, isLeaf: true },
  11. { id: 'node8', size: 15, isLeaf: true },
  12. { id: 'node9', size: 15, isLeaf: true },
  13. { id: 'node10', size: 15, isLeaf: true },
  14. { id: 'node11', size: 15, isLeaf: true },
  15. { id: 'node12', size: 15, isLeaf: true },
  16. { id: 'node13', size: 15, isLeaf: true },
  17. { id: 'node14', size: 15, isLeaf: true },
  18. { id: 'node15', size: 15, isLeaf: true },
  19. { id: 'node16', size: 15, isLeaf: true },
  20. ],
  21. edges: [
  22. { source: 'node0', target: 'node1' },
  23. { source: 'node0', target: 'node2' },
  24. { source: 'node0', target: 'node3' },
  25. { source: 'node0', target: 'node4' },
  26. { source: 'node0', target: 'node5' },
  27. { source: 'node1', target: 'node6' },
  28. { source: 'node1', target: 'node7' },
  29. { source: 'node2', target: 'node8' },
  30. { source: 'node2', target: 'node9' },
  31. { source: 'node2', target: 'node10' },
  32. { source: 'node2', target: 'node11' },
  33. { source: 'node2', target: 'node12' },
  34. { source: 'node2', target: 'node13' },
  35. { source: 'node3', target: 'node14' },
  36. { source: 'node3', target: 'node15' },
  37. { source: 'node3', target: 'node16' },
  38. ],
  39. };

创建关系图

完成了上面两步操作,接下来我们就要开始绘图了。
pages/index/index.js 中逻辑修改为

  1. import G6 from '@antv/g6-mobile';
  2. import graphData from './data';
  3. Page({
  4. data: {
  5. canvasWidth: 0,
  6. canvasHeight: 0,
  7. pixelRatio: 1,
  8. },
  9. onLoad() {
  10. const { windowWidth, windowHeight, pixelRatio } = my.getSystemInfoSync();
  11. this.setData({
  12. canvasWidth: windowWidth,
  13. canvasHeight: windowHeight,
  14. pixelRatio,
  15. });
  16. this.ctx = my.createCanvasContext('canvas');
  17. this.draw();
  18. },
  19. ontouch(e) {
  20. this.graph.emitEvent(e);
  21. },
  22. draw() {
  23. const { canvasWidth, canvasHeight } = this.data;
  24. this.graph = new G6.Graph({
  25. container: null, // 可以不写这一行,在小程序中无需传递container
  26. context: this.ctx, // 由于小程序无法创建dom结构,所以在小程序中需要传递canvas的context
  27. renderer: 'mini', // 配置渲染使用小程序模式,后续文档中我们会逐步完善
  28. width: canvasWidth,
  29. height: canvasHeight,
  30. fitView: false,
  31. modes: {
  32. default: ['zoom-canvas', 'drag-node'], // 允许拖拽画布、放缩画布、拖拽节点
  33. },
  34. defaultNode: {
  35. color: '#5B8FF9',
  36. },
  37. });
  38. const nodes = graphData.nodes;
  39. this.graph.data({
  40. nodes,
  41. edges: graphData.edges.map(function (edge, i) {
  42. edge.id = 'edge' + i;
  43. return Object.assign({}, edge);
  44. }),
  45. });
  46. this.graph.render();
  47. },
  48. });

⚠️注意事项

  • 在小程序中无需传递container
  • 由于小程序无法创建dom结构,所以在小程序中需要传递canvas的context
  • renderer: ‘mini’ 配置渲染使用小程序模式,后续文档中我们会逐步完善🧎‍♂️

    撒花🎉

    20210309.gif

    精致的结尾

    G6-Mobile已经发布beta版本,月底完成release的发布,大家在使用过程中有任何疑问24h在线答疑。

结尾后的一点问题

模拟器受限于canvas实现方式,性能较差,原因主要在于worker和render通信成本过高。建议大家在客户端使用测试,支付宝小程序注意一定要开启native-canvas。另外由于beta版可能会有部分功能调整,需谨慎使用在生产环境。

我们也会在这一个月继续优化完善小程序版本,感谢大家的关注。