微信小程序开发——使用第三方插件生成二维码
<p><strong>需求场景:</strong></p><p>小程序中指定页面需要根据列表数据生成多张二维码。</p>
<p><strong>实现方案:</strong></p>
<p>鉴于需要生成多张二维码,可以将生成二维码的功能封装到组件中,直接在页面列表循环中调用就好了。也可以给组件添加slot,在页面调用时写入需要跟二维码组件绑定在一起进行显示的内容。</p>
<p><strong>技术难点:</strong></p>
<p>微信小程序并没有提供官方二维码生成功能魔抗,所以这个就只能自己去找插件实现了。对于网上的插件,有很大一部分都是根据qrcode.js改进的。</p>
<p>对于插件的选择并不是很顺利,第一次选定了<span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">weapp-qrcode</span></span>这个插件,本来开发测试都好好的,到了同事的<span style="color: rgba(255, 0, 0, 1)">华为v10上,就会出现间隔性不显示的问题</span>(两个页面之间切换,有时候会不显示二维码),这个问题已经在git上提了Issues,并被作者标记为bug。</p>
<p>后边又找到另一个插件weapp-qrcode-base64,经反复测试验证,这个插件可以正常使用,已经将这个功能做了个小程序片段,详见:小程序二维码生成组件。</p>
<p><strong>组件代码:</strong></p>
<p>components/qrcode/index.js</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> components/myComponent.js</span>
const QR = require('./weapp-qrcode.js'<span style="color: rgba(0, 0, 0, 1)">)
const rpx2px </span>= wx.getSystemInfoSync().windowWidth / 750<span style="color: rgba(0, 0, 0, 1)">
Component({
options: {
multipleSlots: </span><span style="color: rgba(0, 0, 255, 1)">true</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 在组件定义时的选项中启用多slot支持</span>
<span style="color: rgba(0, 0, 0, 1)">},
properties: {
value: String, </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">二维码内容</span>
width: String, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">二维码宽度(默认长宽相等)</span>
<span style="color: rgba(0, 0, 0, 1)">},
data: {
qrcodeURL: </span>''<span style="color: rgba(0, 0, 0, 1)">
},
ready: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">() {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> imgData = QR.drawImg(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.data.value, {
typeNumber: </span>3,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">码点大小 1-40,数字越大,码点越小,二维码会显得越密集</span>
errorCorrectLevel: 'H',<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">纠错等级 H等级最高(30%) 简单来说,就是二维码被覆盖了多少仍然能被识别出来 详见qrcode.js</span>
size: parseInt(rpx2px * <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.data.width)
})
</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setData({
qrcodeURL: imgData
})
},
methods: {
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 长按保存图片
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
save: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">() {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> self = <span style="color: rgba(0, 0, 255, 1)">this</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> aa =<span style="color: rgba(0, 0, 0, 1)"> wx.getFileSystemManager(),
filePath </span>= wx.env.USER_DATA_PATH + '/qrcode_' + self.data.value + '.png'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">写入临时文件</span>
<span style="color: rgba(0, 0, 0, 1)"> aa.writeFile({
filePath: filePath,
data: self.data.qrcodeURL.slice(</span>22<span style="color: rgba(0, 0, 0, 1)">),
encoding: </span>'base64'<span style="color: rgba(0, 0, 0, 1)">,
success: res </span>=><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">保存临时文件到手机相册中去</span>
<span style="color: rgba(0, 0, 0, 1)"> wx.saveImageToPhotosAlbum({
filePath: filePath,
success: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(res) {
wx.showToast({
title: </span>'保存成功'<span style="color: rgba(0, 0, 0, 1)">,
})
},
fail: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(err) {
console.log(err)
}
})
console.log(res)
},
fail: err </span>=><span style="color: rgba(0, 0, 0, 1)"> {
console.log(err)
}
})
}
}
})</span></pre>
</div>
<p>components/qrcode/index.wxml</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">='qrcode'</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">image </span><span style="color: rgba(255, 0, 0, 1)">src</span><span style="color: rgba(0, 0, 255, 1)">="{{qrcodeURL}}"</span><span style="color: rgba(255, 0, 0, 1)"> bindlongpress</span><span style="color: rgba(0, 0, 255, 1)">='save' </span><span style="color: rgba(255, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">="width:{{width}}rpx; height:{{width}}rpx;margin:0 auto;"</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">image</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">slot </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="text"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">slot</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p><strong>页面引用:</strong></p>
<p>pages/index/index.js</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">Page({
data: {
textArr: [
</span>"11111111"<span style="color: rgba(0, 0, 0, 1)">,
</span>"00000000"<span style="color: rgba(0, 0, 0, 1)">,
</span>"7539514682492"<span style="color: rgba(0, 0, 0, 1)">
]
},
onLoad: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">() {
}
})</span></pre>
</div>
<p>pages/index/index.wxml</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">wx:for</span><span style="color: rgba(0, 0, 255, 1)">="{{textArr}}"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">qrcode </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="iblock"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="{{item}}"</span><span style="color: rgba(255, 0, 0, 1)"> width</span><span style="color: rgba(0, 0, 255, 1)">="440"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">slot</span><span style="color: rgba(0, 0, 255, 1)">="text"</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
{{item}}
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">qrcode</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>上边组件可以点击小程序二维码生成组件导入到微信开发者工具中进行查看。</p>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
个人原创博客,转载请注明来源地址:https://www.cnblogs.com/xyyt<br><br>
来源:https://www.cnblogs.com/xyyt/p/10945435.html
頁:
[1]