关于taro:使用tarocanvas实现微信小程序的图片分享功能-京东云技术团队
业务场景二轮充电业务中,用户充电实现后在订单详情页展现订单相干信息,用户点击分享按钮唤起微信小程序分享菜单,将生成的图片海报分享给微信好友或者下载到本地,好友可通过扫描海报中的二维码加群支付优惠。 应用场景及性能:微信小程序 生成海报图片 分享好友 下载图片 应用技术:Taro vue vant canvas 实现效果图 重点步骤拆分1、封装一个海报分享组件 poster-share.vue 2、用canvas画图,将背景图、费用、二维码等信息绘制在一张图上,其中费用、二维码是动静获取的 3、生成一张本地缓存图片 4、唤起微信分享性能,实现分享和下载性能 重点步骤有了,那么就开干吧! 外围代码实现1、模版局部须要一个画布dom用来绘制图片,一个用来寄存生成图片的dom 问:canvasId为什么须要动静生成呢? 答:防止一个页面中应用多个组件引起的canvasId反复问题 <template> <div class="poster-share__content"> <!-- canvas生成的海报图片 --> <img v-if="posterImg" class="poster-share__content--img" mode="aspectFit" :src="posterImg" > <!-- 分享海报canvas绘制局部 --> <canvas class="poster-share__content--cvs" :canvas-id="canvasId" ></canvas> </div></template>2、款式局部该业务场景下,不能让用户看到画布,然而设置canvas的display为none将不能进行绘制,会报如下谬误,导致绘制失败。 实现形式:采纳定位的形式,将canvas定位到可视区域外,具体代码如下。 .poster-share__content { position: absolute; right: -9999px; top: -9999px; width: 560px; height: 852px; opacity: 0; z-index: -1; &--img { width: 100%; height: 100%; } &--cvs { width: 100%; height: 100%; }}3、外围js局部开始写外围实现啦~ 父组件传参管制子组件是否开始绘制,子组件绘制实现后告诉父组件扭转状态。 name: 'CpPosterShare', model: { prop: 'value', event: 'update:value', }, props: { value: { type: Boolean, default: false, }, config: { type: Object, default: () => ({}), }, }, data () { return { isDraw: false, // 是否开始绘制海报 posterImg: '', // 生成的海报图片地址 canvasId: `canvasId${ Math.random() }`, screenWidth: null, // 屏幕宽度 } }, watch: { value: { handler (val) { this.isDraw = val }, immediate: true, }, isDraw (val) { this.$emit('update:value', val) if (val) { this.init() } }, },首先,咱们做的是一个小程序,将图片放在小程序源码中会加大包的体积,须要从网络上下载图片,因而须要封装一个公共的办法来获取图片的信息。Taro提供getImageInfo办法返回图片的原始宽高、本地门路等信息。 ...