makeQrTempFile.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import UQRCode from 'uqrcodejs'
  2. /**
  3. * 在组件内隐藏 canvas 上绘制二维码,导出临时文件路径供 <image> 展示。
  4. * @param {object} opts
  5. * @param {string} opts.text 二维码内容(出入库单 id)
  6. * @param {string} opts.canvasId canvas-id
  7. * @param {object} opts.componentInstance 组件实例(getCurrentInstance().proxy)
  8. * @param {number} [opts.size=200]
  9. * @returns {Promise<string>} tempFilePath
  10. */
  11. export function makeQrTempFile({ text, canvasId, componentInstance, size = 200 }) {
  12. const content = String(text || '').trim()
  13. if (!content) {
  14. return Promise.reject(new Error('二维码内容为空'))
  15. }
  16. if (!componentInstance) {
  17. return Promise.reject(new Error('缺少组件实例'))
  18. }
  19. return new Promise((resolve, reject) => {
  20. try {
  21. const qr = new UQRCode()
  22. qr.data = content
  23. qr.size = size
  24. qr.margin = 10
  25. qr.make()
  26. const ctx = uni.createCanvasContext(canvasId, componentInstance)
  27. qr.canvasContext = ctx
  28. qr.drawCanvas()
  29. // drawCanvas 内部会 ctx.draw;稍延迟再导出
  30. setTimeout(() => {
  31. uni.canvasToTempFilePath(
  32. {
  33. canvasId,
  34. width: size,
  35. height: size,
  36. destWidth: size,
  37. destHeight: size,
  38. success: (res) => {
  39. if (res.tempFilePath) resolve(res.tempFilePath)
  40. else reject(new Error('二维码导出失败'))
  41. },
  42. fail: (err) => reject(err || new Error('二维码导出失败'))
  43. },
  44. componentInstance
  45. )
  46. }, 120)
  47. } catch (e) {
  48. reject(e)
  49. }
  50. })
  51. }