微信小程序> 小程序批量画布转图片保存

小程序批量画布转图片保存

浏览量:3312 时间: 来源:best-toby

在做一个首页轮播图需要一维码,点击轮播图单项出现弹窗,显示一维码加二维码需求。

问题:使用了太多的canvas,因为canvas是原生组件,所以不存在层级限制。而且弹窗中的画布有时候出现有时候不出现的。

解决方案:1. 想重开一个页面 内容时弹窗内容 (未通过,小程序页面会缓存,也会出现时有时没有)。

                  2. 整体画布转换为图片,然后使用没有限制。

所以采用了第二种方案,但是又出现了问题,画布转图片是一个异步过程。所以第一次使用的时候图片地址不存在,但是当轮播图开始轮播时 又出现了。

解决方案:1.开始想的是深度监听轮播图数组,来更新数据,但是发现只出现一个打印。(未通过,只有一个打印)

                  2. 在1的基础上,使用$set去改变数据,但是发现还是监听不了。(未通过)

                  3. 使用async/await,不是很理解用法,第一次使用失败。(未通过)

                  4.在3的基础上,与promise结合,第一次是一个promise,包括两个异步保存函数(未通过)

                  5. 在4的基础上,尝试一个异步与一个promise结合,在与async/await结合 (成功)

var data = [          {            birthday: "1995-10-26",            gander: 1,            healthCardNo: "123456789012",            idCardNo: "231341231253121",            openId: "wx231235151",            patientId: "324154123151",            patientName: "郑志福",            phone: "13532565621",            phoneIsVerify: false,            unionId: "124435451231",            userType: "patien"          }        ];        this.dataList = data.map(({ healthCardNo }) => {          return {            healthCardNo          };        });        this.setCanvasUrl(this.dataList).then(res => {          var a = [];          res.forEach((v, i) => {            a.push(Object.assign({}, data[i], v));          });          this.cardList = a;          this.$store.commit("SET_HEALTH_CARD_LIST", a);          this.dataList = [];        });
 async setCanvasUrl(data) {      const _data = JSON.parse(JSON.stringify(data));      for (var i = 0; i < _data.length; i++) {        const brId = "barcode" + _data[i].healthCardNo;        const qrId = "qrcode" + _data[i].healthCardNo;        await this.setBarCanvas(brId, _data[i].healthCardNo, 500, 160).then(          res => {            _data[i].barcodeUrl = res;          }        );        await this.setQrCanvas(qrId, _data[i].healthCardNo, 440, 440).then(          res => {            _data[i].qrcodeUrl = res;          }        );      }      return _data;    },    setBarCanvas(brId, healthCardNo, w, h) {      return new Promise((resolve, reject) => {        wxbarcode.barcode(brId, healthCardNo, 500, 160, () => {          wx.canvasToTempFilePath({            canvasId: brId,            quality: 1,            success(res) {              resolve(res.tempFilePath);            },            fail(err) {              console.log(err);            }          });        });      });    },    setQrCanvas(qrId, healthCardNo, w, h) {      return new Promise((resolve, reject) => {        wxbarcode.qrcode(qrId, healthCardNo, 440, 440, () => {          wx.canvasToTempFilePath({            canvasId: qrId,            quality: 1,            success(res) {              resolve(res.tempFilePath);            },            fail(err) {              console.log(err);            }          });        });      });    },

 

总结: 一个异步一个promise,async/await是处理多个异步的。

比如说你一个函数A,需要函数B与函数C都执行完成以后在执行,那么使用async。

那么函数B与函数C就需要使用Promise封装了。(ps: B与C内部没有异步函数调用的话,那么没必要使用async/await语法)

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎