index.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import { AwesomeQR } from "./lib/index";
  2. import { qrTypes } from "./type";
  3. import { COMPONENT_NAME, DEFAULT_SIZE, getPxFromStringOrNumber, getRpxFromStringOrNumber, resetCanvasHeighAndWidth } from "./util";
  4. Component({
  5. properties: qrTypes,
  6. data: {
  7. imgSrc: "",
  8. canvasSize: DEFAULT_SIZE,
  9. },
  10. observers: {
  11. size(newVal) {
  12. this.setData({
  13. canvasSize: getRpxFromStringOrNumber(newVal) + "rpx",
  14. });
  15. },
  16. "text,size,margin,colorDark,colorLight,maskPattern,backgroundDimming,logoScale,correctLevel,logoMargin,logoCornerRadius,dotScale,backgroundImage,logoImage,whiteMargin,autoColor,components,version"() {
  17. this.render();
  18. },
  19. },
  20. lifetimes: {
  21. attached() {
  22. // this.render();
  23. },
  24. detached() { },
  25. },
  26. methods: {
  27. getCanvasAndContext(size) {
  28. return new Promise((reslove, reject) => {
  29. try {
  30. const query = this.createSelectorQuery();
  31. query
  32. .selectAll(".qr-canvas")
  33. .fields({ node: true, size: true, id: true })
  34. .exec((res) => {
  35. const canvasList = res[0].map((item) => {
  36. const canvas = resetCanvasHeighAndWidth(item.node, size);
  37. return canvas;
  38. });
  39. reslove(canvasList);
  40. });
  41. }
  42. catch (error) {
  43. console.error(`${COMPONENT_NAME} 组件获取canvas时报错`, error);
  44. reject(error);
  45. }
  46. });
  47. },
  48. async render() {
  49. const { text, size, margin, colorDark, colorLight, maskPattern, backgroundDimming, logoScale, correctLevel, logoMargin, logoCornerRadius, dotScale, backgroundImage, logoImage, whiteMargin, autoColor, components, version, } = this.data;
  50. let totalSize = getPxFromStringOrNumber(size);
  51. this.setData({
  52. totalSize,
  53. });
  54. const [qrMainContainer] = await this.getCanvasAndContext(totalSize);
  55. let option = {
  56. text: text,
  57. size: totalSize,
  58. margin: getPxFromStringOrNumber(margin),
  59. correctLevel: correctLevel,
  60. maskPattern,
  61. version,
  62. components: components,
  63. colorDark: colorDark,
  64. colorLight: colorLight,
  65. autoColor: autoColor,
  66. backgroundImage: backgroundImage,
  67. backgroundDimming: backgroundDimming,
  68. whiteMargin: whiteMargin,
  69. logoImage: logoImage,
  70. logoScale: logoScale,
  71. logoMargin: getPxFromStringOrNumber(logoMargin),
  72. logoCornerRadius: getPxFromStringOrNumber(logoCornerRadius),
  73. dotScale: dotScale,
  74. canvasContainer: { qrMainContainer },
  75. };
  76. if (!this.data.qrDraw) {
  77. this.data.qrDraw = new AwesomeQR(option);
  78. }
  79. else {
  80. this.data.qrDraw.setOptions(option);
  81. }
  82. if (!text) {
  83. return;
  84. }
  85. this._draw();
  86. },
  87. // 获取生成二维码的临时文件
  88. getQrFile() {
  89. return this.data.imgSrc;
  90. },
  91. // 获取生成二维码的base64
  92. getQrData(type, encoderOptions) {
  93. return this.data.qrDraw && this.data.qrDraw.getDataUrl(type, encoderOptions);
  94. },
  95. saveImg() {
  96. wx.saveFile({
  97. tempFilePath: this.data.imgSrc,
  98. })
  99. .then((rsp) => {
  100. console.log(rsp);
  101. })
  102. .catch((err) => {
  103. console.log(err);
  104. });
  105. },
  106. _draw() {
  107. this.data.qrDraw
  108. .draw()
  109. .then((rsp) => {
  110. this.setData({
  111. imgSrc: rsp,
  112. });
  113. this.triggerEvent("load", rsp);
  114. })
  115. .catch((err) => {
  116. this.triggerEvent("error", err);
  117. });
  118. },
  119. },
  120. });