vue3+qrcode插件实现下载二维码图片(.png、.svg格式)

注释:qrcode可通过canvas的toDataURL方法下载对应的png图片,比较恶心的是下载svg格式(必须记录一下)

  1. 安装一下qrcode插件
npm i qrcode --save  或
yarn add qrcode
  1. 页面引入
import qrcode from 'qrcode'; // 引入qrcode
  1. vue文件使用
<div class="qrcode-box">
   	<canvas id="qrcode" ref="qrcodeRef" :width="qrCodeSize" :height="qrCodeSize" />
    <div id="qrcode-svg-container"></div>
</div>

<style scoped lang='less'>
.qrcode-box { // 无需显示二维码(隐藏处理)
    position: absolute;
    left: -999px;
    top: -999px;
}
</style>
  1. js 处理
<script setup lang='ts'>
import { reactive, ref, nextTick, onMounted, unref } from 'vue';

const qrAccURL = ref<string>(''); // 二维码内容地址

const qrcodeRef = ref<null>(); // 二维码DOM

const qrCodeSize = ref<number>(200); // 二维码大小

const qrCodeType = ref<number>(1); // 二维码类型 1为图片 2为svg

// 点击下载登记二维码事件
const onClickDownQrCodeButton = (size:number, type:number) => {
    qrCodeSize.value = size;
    qrCodeType.value = type;
    generateQRCode();
};

// 生成二维码的方法
const generateQRCode = () => {
    nextTick(()=>{
        const size = unref(qrCodeSize);
        const content = unref(qrAccURL);
        const downType = unref(qrCodeType);
        const canvas = qrcodeRef.value;
        canvas.width = size;
        canvas.height = size;
        canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height);
            qrcode.toCanvas(
            canvas,
            content,
            { width: size, marign: 10 },
            (res:any) => {
                console.log('回调:', res);
                const canvasData = document.getElementById('qrcode'); 
                const dataURL = canvasData.toDataURL(); //canvas获取的base64格式
                if(downType === 1){
                    handleDowndloadPng(dataURL);
                }else{
                    handleDownloadSvg(dataURL);
                }
            },
        );
    });
};

// 处理下载二维码png格式事件
const handleDowndloadPng = (ImgURL:any) =>{
    const size = unref(qrCodeSize);
    const link = document.createElement('a');
    link.style.display = 'none';
    link.href = ImgURL;
    link.setAttribute('download', `登记二维码尺寸:${size}x${size}`);
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
};

// 处理下载二维码为svg格式事件
const handleDownloadSvg = (ImgURL:any) => {
    const size = unref(qrCodeSize);
    //svg 的dom节点(字符串)
    var svgString = `<svg id="downloadQrCodeSvg" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    width="${size}px" height="${size}px"
    viewBox="0 0 ${size} ${size}" enable-background="new 0 0 ${size} ${size}" xml:space="preserve">
        <image id="image0" width="${size}" height="${size}" x="0" y="0" href="${ImgURL}"></image>
    </svg>`;
    const node = document.querySelector('#qrcode-svg-container');
    node.insertAdjacentHTML('afterbegin', svgString);
    console.log(node);
    setTimeout(()=>{
        const svgTagEl = document.querySelector('#downloadQrCodeSvg').outerHTML;
        downsvg(svgTagEl);
    }, 300);
};
const downsvg = (arg) => {
    const size = unref(qrCodeSize);
    var blob = new Blob([arg], { type: 'image/svg+xml;charset=utf-8' });
    var href = window.URL.createObjectURL(blob);
    const link = document.createElement('a');
    link.href = href;
    link.setAttribute('download', `登记二维码尺寸:${size}x${size}`);
    document.body.appendChild(link);
    link.click();
   document.body.removeChild(link);
};

这里暂未实现封装,感兴趣的可以自己考虑一下封装。谢谢!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用qrcode.vue生成二维码的步骤如下: 1. 引入qrcode.vue组件,该组件的体积相对较小,但不能添加中心logo。 2. 在Vue模板中使用vue-qr组件,设置id为"qrcode",并传入生成二维码所需的text和size参数。 3. 在Vue模板中添加一个按钮,当点击按钮时触发saveImg函数。 4. 在Vue的script setup中,使用import语句引入qrcode.vue组件和其他所需的资源。 5. 根据需要,可以在logoSrc变量中设置logo的路径。 6. 在saveImg函数中,获取生成的二维码图片元素,创建一个下载链接,并设置链接的href和download属性。 7. 点击按钮后,调用a元素的click方法,实现下载二维码的功能。 你可以参考以下代码示例: ```html <template> <qrcode id="qrcode" :text="value" size="135"></qrcode> <br /> <el-button @click="saveImg">下载二维码</el-button> </template> <script setup> import qrcode from 'qrcode.vue' import code_logo from '../../assets/vue.svg' const props = defineProps({ value: { type: String, default: 'https://www.baidu.com/' } }) let logoSrc = code_logo function saveImg() { let picData = document.getElementById("qrcode") let a = document.createElement("a"); a.href = picData.src; a.download = "qrcode.png"; a.click(); } </script> ``` 请注意,以上代码只是一个示例,具体的实现方式可能会根据你的实际需求和项目配置而有所不同。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Vue3项目生成并下载二维码,关于vue-qr.vueqrcode.vue插件之间的区别](https://blog.csdn.net/qq_51758070/article/details/128232266)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值