element table展示二维码及下载

使用element ui 的table组件循环渲染二维码以及踩坑

下载安装依赖

npm install qrcodejs --save-dev
import QRCode from 'qrcodejs2';
 <xx-table-column prop="qrcode_src" min-width="76" label="二维码">
       <template slot-scope="scope">
            <div @mouseenter="getQRCodeUrl(scope.row.source_url, scope.row.id)">
                <xx-tooltip placement="right" effect="light" class="Fragment">
                    <div slot="content">
                        <div :ref="'qrcodeBox' + scope.row.id" class="qrcode-box"></div>
                        <span class="sourceName">{{ scope.row.source_name }}</span>
                    </div>
                    <xx-button
                        type="text"
                        size="small"
                        @click="downloadSingleUrl(scope.row)"
                        >下载</xx-button
                    >
                </xx-tooltip>
            </div>
        </template>
</xx-table-column>
getQRCodeUrl(qrcode_url, id) {
			// 此处是一个坑,
            this.$refs['qrcodeBox' + id].innerHTML = '';
            new QRCode(this.$refs['qrcodeBox' + id], {
                text: qrcode_url, // 需要转换为二维码的内容
                width: 60,
                height: 60,
                // render: "canvas", // 设置渲染方式(有两种方式 table和canvas,默认是canvas)
                colorDark: '#000000', //二维码颜色
                colorLight: '#ffffff', //二维码背景色
                correctLevel: QRCode.CorrectLevel.H //容错率,L/M/H
            });
        },

首先实现的是鼠标移入的时候才展示对应的二维码,不用一开始就全部加进去,生成二维码的函数是官方给出的,是可以通过id或这ref获取唯一标识拿到DOM添加元素。但是由于列表数据是table循环生成的,所有id或者ref的并不唯一,会导致一个结果,也是我开发中遇到的坑。鼠标移入上去的时候并不展示二维码,其实不是没有生成,也不是没有展示。而是所有生成的二维码,都加在列表的最后一行的引用dom中。把前面生成的叠加在一起。
解决方法在上面的代码中,就是ref 后面拼接一个唯一的标识,我们后端返回的每条是有一个唯一的id,具体按照你们公司的数据来拼接。

二维码单个下载封装

downloadSingleUrl(params) {
    var canvasData = this.$refs['qrcodeBox' + params.id].getElementsByTagName('canvas');
    var a = document.createElement('a');
    var event = new MouseEvent('click'); // 创建一个单击事件
    a.href = canvasData[0].toDataURL('image/png');
    a.download = params.source_name; // 下载的文件名,跟你传入的数据来命名
    a.dispatchEvent(event); // 触发a的单击事件
},
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值