vue3:使用:图片生成二维码并复制

news2024/11/20 10:28:20

实现在 vue3 中根据 url 生成一个二维码码,且可以复制。

注)复制功能 navigator.clipboard.write 只能在安全的localhost 这种安全网络下使用。https中需要添加安全证书,且在域名(例:https://www.baidu.com)这种下即可。

1、安装

注)由于qrcodejs的兼容性问题,需要在vue3中引入qrcodejs2-fix才能正常生成二维码。

npm install qrcodejs2-fix

2、在vue文件中导入模块qrcodejs2-fix

import QRCode from 'qrcodejs2-fix';

3、场景一、生成二维码码、复制(生成的二维码图片)

<template>
    // 点南生成二维码
    <e-button type="primary" @click="handleGenerate">点击生成二维码</e-button>
    // 生成的二维码图片
    <div id="imgCode"></div>
    // 复制二维码
    <e-button type="primary" @click="handleCopyCode">复制</e-button>
</template>

<script setup>
// 1、生成二维码(id名称, 参数)
function handleGenerate(idName, name) {
    // 采集二维码:路径
    const ip = 'https://crm.waihucc.com';
    const getIPAddress = `${ip}/h5/index.html`; 
    const url = `${getIPAddress}?companyId=80&saleId=${name}`;
    // 获取二维码码 div 上的 id
    const qrCodeElement = document.getElementById(idName);
    if (qrCodeElement) {
        qrCodeElement.innerHTML = '';
        new QRCode(qrCodeElement, {
            text: url || '',
            width: 100, // 二维码宽度
            height: 100, // 二维码高度
        });
    }
}

// 2、复制生成的二维码(id 名称)
function handleCopyCode(idName) {
    // 1、获取图片元素
    const imgElement = document.querySelector(`#${idName} img`);
    // 2、创建一个新的Image对象
    const img = new Image();
    // 3、设置Image对象的src为图片元素的src
    img.src = imgElement.src;
    // 4、监听图片加载完成事件
    img.onload = function () {
        //(1)创建 Canvas
        const canvas = document.createElement('canvas');
        canvas.width = img.width;
        canvas.height = img.height;
        const ctx = canvas.getContext('2d');
        //(2)在Canvas上绘制图片
        ctx.drawImage(img, 0, 0);
        //(3)获取 Canvas 内容作为Blob
        canvas.toBlob(function (blob) {
            //(4)使用Clipboard API 把生成对象URL,写入到剪贴板
            navigator.clipboard
                .write([new ClipboardItem({ 'image/png': blob })])
                .then(() => {
                    ElMessage({
                        message: '二维码已复制',
                        type: 'success',
                    });
                })
                .catch(() => {
                    console.error('图像复制失败');
                });
        });
    };
}
</script>

 4、场景二、点"复制"按钮,生成二维码,点击"复制"直接复制生成的二维码图片

 

<template>
    // 复制二维码
    <e-button type="primary" @click="generateCode">复制</e-button>
    // 生成的二维码图片
    <div id="imgCode"></div>
</template>

<script setup>
// 1、
const generateCode = (url, idName) => {
    document.getElementById(idName).innerHTML = '';
    new QRCode(document.getElementById(idName), {
        text: url || '',
    });

    // 获取 Canvas 元素
    const canvas = document.getElementById(idName).querySelector('canvas');
    // 将 Canvas 转换为 Data URL
    const dataURL = canvas.toDataURL();
    // 创建一个 Blob 对象
    const blob = dataURLToBlob(dataURL);
    // 使用 Clipboard API 复制 Blob 对象到剪贴板
    navigator.clipboard
        .write([new ClipboardItem({ 'image/png': blob })])
        .then(() => {
            ElMessage({
                message: '二维码已复制',
                type: 'success',
            });
        })
        .catch(() => {
            console.error('图像复制失败');
        });
};

// 2、
const dataURLToBlob = (dataURL) => {
    const arr = dataURL.split(',');
    const mime = arr[0].match(/:(.*?);/)[1];
    const bstr = atob(arr[1]);
    let n = bstr.length;
    const u8arr = new Uint8Array(n);
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], { type: mime });
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/945702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c#多线程—基础概念到“双色球”项目实现(附知识点目录、代码、视频)

总结&#xff1a;视频中对于多线程讲的非常透彻&#xff0c;从线程基础概念—>.net不同版本出现的线程方法—>多线程常出现问题—>双色球项目实践&#xff0c;每个知识点都有代码实操&#xff0c;受益匪浅。附上学习笔记和实操代码。 视频 目录 一、线程、进程概念及优…

新建Spring Boot项目

使用IDEA 来创建: 文件-新建-项目 填写项目元数据 选择依赖项 此处可以先选 web-spring web 关于这些依赖项&#xff0c;更多可参考&#xff1a; IDEA创建Spring boot项目时各依赖的说明&#xff08;Developer Tools篇&#xff09;[1] 项目结构介绍 展开项目&#xff0c;此时…

redis应用 2:延时队列

我们平时习惯于使用 Rabbitmq 和 Kafka 作为消息队列中间件&#xff0c;来给应用程序之间增加异步消息传递功能。这两个中间件都是专业的消息队列中间件&#xff0c;特性之多超出了大多数人的理解能力。 使用过 Rabbitmq 的同学知道它使用起来有多复杂&#xff0c;发消息之前要…

socket的TCP和UDP样例

【70天稳扎稳打学完JavaEE初阶】 TCP和UDP的区别及相关的不同应用 UDP实现回显功能一、UdpEchoServer服务器二、UdpEchoClient 客户端写一个 翻译服务器&#xff08;继承服务器&#xff09; UDP示例二&#xff1a;展示服务器本地某个目录的下一级子文件列表服务UDP服务器UDP客户…

什么是ChatGPT水印,ChatGPT生成的内容如何不被检测出来,原理什么?

太长不看版 1. 什么是ChatGPT水印&#xff1f; ChatGPT水印是AI以伪随机方式生成的独特tokens序列。该序列用来作为水印&#xff0c;以区分AI生成内容和人类原创内容。 2. 如何规避ChatGPT水印&#xff1f; 一种规避方法是使用其他AI模型改写ChatGPT生成的文本。这会破坏水…

Nat. Mach. Intell 2020 | drugVQA+:准VAQ系统预测药物-蛋白质相互作用

论文标题&#xff1a;Predicting drug–protein interaction using quasi-visual question answering system 论文地址&#xff1a;Predicting drug–protein interaction using quasi-visual question answering system | Nature Machine Intelligence 代码&#xff1a;GitH…

继承AndroidView Model的错误

ViewModelProvider(this)[RegisterViewModel::class.java] 一行简单的代码&#xff0c;总是报这个错误 Caused by: java.lang.NoSuchMethodException: com.xinfa.registerlogin.viewmodel.LoginViewModel. [class android.app.Application] 经过一下午的思索&#xff0c;终于找…

科普:什么是DNS劫持?

DNS劫持又叫做域名劫持&#xff0c;指攻击者利用其他攻击手段&#xff0c;篡改了某个域名的解析结果&#xff0c;使得指向该域名的IP变成了另一个IP&#xff0c;导致对相应网址的访问被劫持到另一个不可达的或者假冒的网址&#xff0c;从而实现非法窃取用户信息或者破坏正常网络…

我们的第一个 Qt 窗口程序

Qt 入门实战教程&#xff08;目录&#xff09; Windows Qt 5.12.10下载与安装 为何使用Qt Creator开发QT 本文介绍用Qt自带的集成开发工具Qt Creator创建Qt默认的窗口程序。 本文不需要你另外安装Visual Studio 2022这样的集成开发环境&#xff0c;也不需要你再在Visual St…

【单片机】有人WH-LTE-7S1 4G cat1 模块连接服务器,教程,记录

文章目录 4G cat1 模块封装引脚名称功能拓扑图串口模块调试WH-LTE-7S1 4G cat1 模块 我买的这个模块内置了电信卡&#xff0c;不用插电话卡就能用&#xff0c;要插也行&#xff0c;在背面。 ⚫ 5-16V 宽电压供电 ⚫ LTE Cat 1&#xff0c;搭载 4G 网络&#xff0c;低时延&…

2023年腾讯云轻量应用服务器优缺点大全

2023年腾讯云轻量应用服务器优缺点大全&#xff0c;腾讯云轻量应用服务器性能如何&#xff1f;轻量服务器CPU内存带宽配置高&#xff0c;CPU采用什么型号主频多少&#xff1f;轻量应用服务器会不会比云服务器CVM性能差&#xff1f;腾讯云服务器网详解CPU型号主频、内存、公网带…

《存储IO路径》专题:IO虚拟化初探

大家好&#xff0c;欢迎来到今天的科技小课堂。今天我们要聊聊的是一项非常有趣且实用的技术——I/O虚拟化&#xff08;Input/Output Virtualization&#xff0c;简称IOV&#xff09;。想象一下&#xff0c;如果把物理硬件资源比作一道丰盛的大餐&#xff0c;那么IOV就是那位神…

Java 若依框架系统工具生成代码,前后端以及菜单添加使用示例

前言 若依框架不多介绍&#xff0c;目前比较流行的一款开源的后台管理框架&#xff0c;主要技术栈 后台spingboot、spingcloud 前端vue2 vue3版本的都有&#xff0c;可以去官方下载看看。 若依框架提供代码生成的功能&#xff0c;方便我们把简单的增删改查前后端代码生成直接…

【JAVA基础——JAVA8版本特性】

JAVA基础 版本特性 文章目录 JAVA基础Java8Lambda表达式lambda表达式类型 函数式接口接口默认方法与静态方法接口默认方法接口静态方法 方法引用OptionalStream流生产Stream Source的方式流的方法parallelStream流 Date/Time API其他特性重复注解扩展注解参数名字保留在字节码…

绿色能源迎来跨越式增长新时代

当今世界&#xff0c;百年未有之大变局加速演进&#xff0c;新一轮科技革命和产业变革深入发展&#xff0c;全球气候治理呈现新局面&#xff0c;新能源和信息技术紧密融合&#xff0c;生产生活方式加快转向低碳化、智能化&#xff0c;能源体系和发展模式正在进入非化石能源主导…

ROS中使用Navigation报错信息

在ROS中使用遇到了几个Navigation报错信息&#xff0c;在这里进行下记录&#xff1a; [ WARN] [1688134727.429227824]: The origin for the sensor at (7.35, 13.12) is out of map bounds. So, the costmap cannot raytrace for it. 解决办法&#xff1a; [ WARN] [16881…

flink on yarn with kerberos 边缘提交

flink on yarn 带kerberos 远程提交 实现 flink kerberos 配置 先使用ugi进行一次认证正常提交 import com.google.common.io.Files; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.flink.client.cli.CliFrontend; import o…

Gorilla LLM:连接海量 API 的大型语言模型

如果你对这篇文章感兴趣&#xff0c;而且你想要了解更多关于AI领域的实战技巧&#xff0c;可以关注「技术狂潮AI」公众号。在这里&#xff0c;你可以看到最新最热的AIGC领域的干货文章和案例实战教程。 一、前言 在当今这个数字化时代&#xff0c;大型语言模型&#xff08;LLM…

史上最全AP、mAP详解与代码实现

文章目录 前言一、mAP原理1、mAP概念2、准确率3、精确率4、召回率5、AP: Average Precision 二、mAP0.5与mAP0.5:0.951、mAP0.52、mAP0.5:0.95 三、mAP代码实现1、真实标签json文件格式2、模型预测标签json文件格式3、mAP代码实现4、mAP结果显示 四、模型集成mAP代码1、模型mai…

项目:点餐系统3mysql知识回顾MySQL客户端

连接数据库 mysql -uroot -p 密码&#xff1a;空 一、第三方库&#xff1a;MySQL 数据库-存储并管理数据的仓库&#xff0c;是一个C/S架构 MySQL客户端通过sql来告诉MySQL服务器&#xff0c;自己需要做什么操作 1.sql语句 sql&#xff1a;structure query language结构化查询…