准备工作
在开发中经常会遇到邀请或者分享页面需要生成海报分享,生成海报需要用到 html2canvas 插件,页面里一般都带有二维码,所以还需要一个生成二维码的插件,和一个弹出层组件,html2canvas 插件通过npm install html2canvas --save
命令下载,二维码和弹出层可以在 uniapp 的插件市场搜索直接下载
生成二维码
二维码的生成需要一个 canvas,设置 canvas 的 id 和宽高
<view class="qr_code">
<canvas canvas-id="qrcode" v-show="qrShow" style="width: 110rpx;height: 110rpx;"/>
</view>
复制代码
我们需要进入邀请页面的时候就生成好了二维码,首先引入 uqrcode.js 文件,在 created 生命周期函数里调用 uqrcode.js 的方法,传入 id,内容,大小,边距等等
import uQRCode from '../../../common/js/uqrcode.js'
created() {
this.qrcode('https://www.baidu.com/')//传入你要传入二维码的内容
},
methods:{
qrcode(text){
this.qrShow=true
uQRCode.make({
canvasId: 'qrcode',//canvas-id
componentInstance: this,
text: text,//二维码内容
size: 55,//二维码大小
margin: 0,//间距
backgroundColor: '#ffffff',//背景颜色
foregroundColor: '#000000',//二维码颜色
fileType: 'jpg',//文件类型
errorCorrectLevel: uQRCode.errorCorrectLevel.H,
success: res => {
console.log(res);
}
})
},
}
复制代码
ok,这样我们的二维码就出来了
复制链接
一般除了二维码还有邀请码,点击按钮实现复制邀请码,这个可以用 uniapp 内置的 api,uni.setClipboardData()
<view class="contents">
<view class="text">
邀请码
</view>
<view class="code">
{{code}}
</view>
</view>
<button class="poster-btn" @click="copy(code)">复制邀请码</button>
//复制
copy(data){
uni.setClipboardData({
data,
success() {
console.log('success');
}
})
},
复制代码
当我们点击复制的时候就会弹出弹窗提示
生成海报
一个简陋的页面大概就完成了
当我们点击生成海报按钮的时候就会将整个页面生成一张海报图片,先将下载好的 html2canvas 插件导入,然后传入相应的信息即可生成一张图片,但是这个插件需要传入 id,但是在 app 端的话是操作不了 dom 的,对此,uniapp 为我们提供了一个解决办法,让我们可以在 app 端操作 dom:
renderjs 可以在视图层操作 dom,那么如何去使用 renderjs 呢?只需要新建一个script
节点,设置 lang 为 renderjs,在这个 renderjs 里操作 dom 生成海报
//service层
<script>
export default {
}
</script>
//renderjs
<script module="canvas" lang="renderjs">
export default {
}
</script>
复制代码
导入 html2canvas 插件,在生成海报的方法里使用 document.getElementById()获取要生成海报区域的 id 传入 html2canvas 方法里生成 canvas,在 canvas 对象里设置海报的一些属性,如:背景颜色,宽高等等,再使用 canvas 的 toDataURL()转为 base64 格式的图片
<script module="canvas" lang="renderjs">
import html2canvas from "html2canvas"
export default {
methods:{
async toImage(event,ownerInstance){
try{
const timeout=setTimeout(async ()=> {
const htmlCanvas=document.getElementById('htmlCanvas')
const canvas=await html2canvas(htmlCanvas,{
backgroundColor: null,
useCORS: true // 如果截图的内容里有图片,可能会有跨域的情况,加上这个参数,解决文件跨域问题
})
const url = canvas.toDataURL('image/png')
this.$ownerInstance.callMethod('creates',{//可以调用service层的方法
url
})
clearTimeout(timeout)
}, 500);
}catch(e){
//TODO handle the exception
console.log(e);
}
},
}
}
</script>
复制代码
通过this.$ownerInstance.callMethod()
将生成好的 base64 格式的图片传给 service 层的方法
//生成海报
creates(options){
console.log(options);
this.imgUrl = options.url//用于展示海报
},
复制代码
为了让海报显示出来,我们使用下载好弹出层组件,图片生成完成的时候弹出弹出层将图片展示出来,且可以分享到微信,朋友圈,qq 等等选项,下面是我的生成海报的一个效果,具体的展示的样式和内容可以自行设置
关于分享的操作可以看看之前写的https://xie.infoq.cn/article/1dd874855ab0293ffc63bfa9a这篇文章,不过海报生成只能在 h5 和 app,小程序是不能生成的,因为 renderjs 不支持小程序端
评论