最近写二维码的时候,突然想起之前项目遇到过的一个问题,网上也没有这方面解答,想到大家今后可能也会遇到这类问题,在此记录下来,希望对你们有所帮助,大佬们不喜勿喷,qrcode配合画布canvas本地生成二维码的时候第一次能够正常显示,最下方会贴出代码
跨页面后显示异常
刚开始是有些头疼的,因为控制台一切正常,没有抛出错误,然后去看qrcode的参数属性也没有问题,我是多个页面需要生成多个二维码,封装了qrcode组件
F12逐步排查看html结构,生成多个二维码之后并没有销毁
所以第一想到的是可能是覆盖问题,我也不知道为什么关闭窗口后并没有销毁,那么就手动remove()销毁它吧,结果还是悲剧的,依旧没有效果,通过打印结果可以得知二维码是正常生成了的只是没有被渲染上去
难道是跨页面的时候当前页面的id和其他页面的id重复导致qrcode生成二维码成功了但是画布无法正常显示吗,那么只需要每个引用了qrcode组件的页面都传一个唯一的值过来做id就行了,抱着试一试的态度我再次打开了vscode,将父组件的name传了过来
父组件
子组件id
props
之后再获取到nameOn生成二维码,还挺好用
<template>
<div>
<!-- 单据二维码--> <el-table-column :label="$t('receipt.orderQRCode')" header-align="center" align="center" min-width="150"> <template slot-scope="scope"> <el-button type="primary" @click="createORCode(scope.row.receiptOrder)"> {{$t('receipt.generateQRcode')}} </el-button> </template> </el-table-column>
<!– 生成二维码弹框 –> <q-r-code-dialog v-if=”codeDialogVisible” :orderNumber=”orderNumber” :nameOn=”this.$options.name” ref=”codeDialog” @confirm=”createORCode”> </q-r-code-dialog> </div> </template>
/** * 生成二维码 */ createORCode (orderNumber) { this.codeDialogVisible = true this.orderNumber = orderNumber this.$nextTick(() => { this.$refs.codeDialog.init() }) },
qrcode公共组件
<template> <!-- 二维码 --> <el-dialog width="400px" :title="$t('receipt.viewQRCode')" :close-on-click-modal="false" :visible.sync="visible" @closed="visible = false" :append-to-body="true" > <el-container style="margin-left: 5px"> <el-header style="height: 15px"> {{ $t("receipt.documentNo") + ":" + orderNumber }} </el-header> <el-main> <canvas :id="nameOn" class="canvas"></canvas> </el-main> </el-container> </el-dialog> </template> <script> import QRCode from 'qrcode' export default { name: 'QRCode', props: { orderNumber: { type: String, default: '' }, nameOn: { type: String, default: '' } }, data () { return { visible: false } }, methods: { // 初始化 init () { this.visible = true this.$nextTick(() => { console.log(this.orderNumber, 'orderNumber') // console.log(this.nameOn, 'name') if (this.orderNumber) { // this.viewImgVisible = true // 生成二维码 let opts = { errorCorrectionLevel: 'H', type: 'image/jpeg', rendererOpts: { quality: 0.3 } } console.log(opts, 'opts') let canvasEle = document.querySelector(`#${this.nameOn}`) QRCode.toDataURL(canvasEle, this.orderNumber, opts, function (err) { if (err) throw err }) } }) } } } </script> <style scoped> .canvas { margin-left: 10%; width: 80% !important; height: 80% !important; } </style>