关于 uniapp - 微信小程序 canvas生成海报 第一次成功,第二次就透明(黑色) 解决方案

问题描述

使用canvas生成海报,第一次成功,第二次偶尔渲染图片为空,第三次直接全为透明, 生成后的图片有设置长按保存,出现的是一张透明的图片

解决方案

点击生成海报时,设置动态的canvasID

官方文档说明 tip:同一页面中的 canvas-id 不可重复,如果使用一个已经出现过的 canvas-id,该 canvas 标签对应的画布将被隐藏并不再正常工作

组件中

  1. <!-- #ifdef MP-WEIXIN -->
  2. <canvas :id="canvasId" type="2d" :style="{ width: '614rpx', height: canvasHeight + 'rpx' }" mode="widthFit" />
  3. <!-- #endif -->
  4. <!-- #ifndef MP-WEIXIN -->
  5. <canvas :canvas-id="canvasId" :id="canvasId" :style="{ width: '614rpx', height: canvasHeight + 'rpx' }" />
  6. <!-- #endif -->

canvas生成海报图片组件: 设置props参数,id为必传

  1. props: {
  2. <!-- 必传 canvasid 且唯一 -->
  3. canvasId: {
  4. type: String,
  5. require: true
  6. },
  7. <!-- 生成海报所需参数 -->
  8. posterData: {
  9. type: Object,
  10. default:{}
  11. },
  12. }

父级页面: 点击生成海报,则设置动态ID
template

  1. <uni-popup ref="share" type="center">
  2. <topic-post-canvas ref="postCanvas" :canvasId="postCanvasId" ></topic-post-canvas>
  3. </uni-popup>

data

  1. // 分享参数
  2. isShowPostCanvas: false, // 是否显示海报
  3. postCanvasId: 'canvas', // 唯一且不重复
  4. shareCardData:{}, // 分享卡片的数据 - 文案根据shareData.type来改变
  5. posterData: {}, // 打开分享弹窗时,记录的参数

调用的methods

  1. // 打开帖子分享弹窗
  2. openShare: function(e){
  3. console.log('share',e)
  4. // 动态设置canvasID
  5. let timeStamp = Date.parse(new Date());
  6. this.postCanvasId = this.postCanvasId + timeStamp;
  7. // 设置分享数据
  8. this.shareData = e;
  9. this.openSharePopup();
  10. },

本人因canvas id 设置为静态,才第二次生成 失败