主题
开发问题
uniapp+htmal2canvas 实现海报分享的功能。
问题 1:html2canvas 在 uniapp 小程序环境下不能使用。
原因:html2canvas 为网页库,在 uniapp 的逻辑层环境可能运行会缺少方法导致报错。
解决方案:可以通过 uniapp 的 renderjs 的让其运行在视图层。renderjs 相关文档
相关代码:
javascript
<template>
<view @click="renderScript.emitData"></view> //只能在此调用,逻辑层不能调用
</template>
<script>
export default {
methods: {
async receiveRenderData(val) {
console.log(val) // 接受传过来参数
},
},
}
</script>
<script module="renderScript" lang="renderjs">
import html2canvas from 'html2canvas';
export default {
methods: {
// 发送数据到逻辑层
emitData(e, ownerVm) {
let targetDom = document.getElementsByClassName('lb-big-box')[0]
targetDom.style.width = targetDom.scrollWidth + 'px'
targetDom.style.height = targetDom.scrollHeight + 'px'
html2canvas(targetDom, {
useCORS: true,
width: targetDom.scrollWidth, //dom 原始宽度
height: targetDom.scrollHeight,
logging: true,
scale: 5
}).then((canvas) => {
targetDom.style.width = targetDomWidth + 'px'
targetDom.style.height = targetDomHeight + 'px'
ownerVm.callMethod('receiveRenderData', {
url: canvas.toDataURL('image/png'),
width: targetDom.scrollWidth, //dom 原始宽度
height: targetDom.scrollHeight,
})
});
},
}
};
</script>
问题 2:生成 html2canvas 的图片高度不全的问题。
原因:生成的元素父级及其不能为滚动区域。
解决方案:将其高度固定为 scrollHeight 及其父级能不能出现滚动,打印后将其高度还原。
javascript
emitData(e, ownerVm) {
let targetDom = document.getElementsByClassName('lb-big-box')[0]
targetDom.style.width = targetDom.scrollWidth + 'px'
targetDom.style.height = targetDom.scrollHeight + 'px'
html2canvas(targetDom, {
useCORS: true,
width: targetDom.scrollWidth, //dom 原始宽度
height: targetDom.scrollHeight,
logging: true,
scale: 5
}).then((canvas) => {
targetDom.style.width = targetDomWidth + 'px'
targetDom.style.height = targetDomHeight + 'px'
ownerVm.callMethod('receiveRenderData', {
url: canvas.toDataURL('image/png'),
width: targetDom.scrollWidth, //dom 原始宽度
height: targetDom.scrollHeight,
})
});
总结:遇到问题首先要多实践,必要时可以和大家一起多讨论,个人思维太狭隘,容易陷入思维盲区。
问题 3:uniapp 小程序环境不能将 base64 转为图片文件。
原因:uniapp 小程序的环境中没有 blob,app 的 plus 库不能用
解决方案:暂定服务端接口解析 base64 并上传至 oss 服务器,返回图片文件 url。