index.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { Canvas } from '@antv/f2';
  2. function wrapEvent(e) {
  3. if (!e) return;
  4. if (!e.preventDefault) {
  5. e.preventDefault = function () {};
  6. }
  7. return e;
  8. }
  9. Component({
  10. /**
  11. * 组件的属性列表
  12. */
  13. properties: {
  14. onRender: {
  15. type: null,
  16. value: function value() {}
  17. }
  18. },
  19. /**
  20. * 组件的初始数据
  21. */
  22. data: {},
  23. ready: function ready() {
  24. var _this = this;
  25. var query = wx.createSelectorQuery().in(this);
  26. query.select('.f2-canvas').fields({
  27. node: true,
  28. size: true
  29. }).exec(function (res) {
  30. var _res$ = res[0],
  31. node = _res$.node,
  32. width = _res$.width,
  33. height = _res$.height;
  34. var context = node.getContext('2d');
  35. var pixelRatio = wx.getSystemInfoSync().pixelRatio; // 高清设置
  36. node.width = width * pixelRatio;
  37. node.height = height * pixelRatio;
  38. var children = _this.data.onRender(_this.data);
  39. var canvas = new Canvas({
  40. pixelRatio: pixelRatio,
  41. width: width,
  42. height: height,
  43. context: context,
  44. children: children
  45. });
  46. canvas.render();
  47. _this.canvas = canvas;
  48. _this.canvasEl = canvas.canvas.get('el');
  49. });
  50. },
  51. observers: {
  52. // 处理 update
  53. '**': function _() {
  54. var canvas = this.canvas,
  55. data = this.data;
  56. if (!canvas) return;
  57. var children = data.onRender(data);
  58. canvas.update({
  59. children: children
  60. });
  61. }
  62. },
  63. lifetimes: {
  64. detached: function detached() {
  65. var canvas = this.canvas;
  66. if (!canvas) return;
  67. canvas.destroy();
  68. }
  69. },
  70. /**
  71. * 组件的方法列表
  72. */
  73. methods: {
  74. click: function click(e) {
  75. var canvasEl = this.canvasEl;
  76. if (!canvasEl) {
  77. return;
  78. }
  79. var event = wrapEvent(e); // 包装成 touch 对象
  80. event.touches = [e.detail];
  81. canvasEl.dispatchEvent('click', event);
  82. },
  83. touchStart: function touchStart(e) {
  84. var canvasEl = this.canvasEl;
  85. if (!canvasEl) {
  86. return;
  87. }
  88. canvasEl.dispatchEvent('touchstart', wrapEvent(e));
  89. },
  90. touchMove: function touchMove(e) {
  91. var canvasEl = this.canvasEl;
  92. if (!canvasEl) {
  93. return;
  94. }
  95. canvasEl.dispatchEvent('touchmove', wrapEvent(e));
  96. },
  97. touchEnd: function touchEnd(e) {
  98. var canvasEl = this.canvasEl;
  99. if (!canvasEl) {
  100. return;
  101. }
  102. canvasEl.dispatchEvent('touchend', wrapEvent(e));
  103. }
  104. }
  105. });