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

2023-11-07

实现在 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>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3:使用:图片生成二维码并复制 的相关文章

  • 如何在同一页面上使用AJAX处理多个表单

    我有一个表单 当我单击 提交 时 它就被提交了 然后该表单隐藏 操作页面的结果显示在 div 中 classname dig 它工作正常 但是当我添加另一个表单时 它停止正常工作并且所有表单同时提交 我如何更改我的代码 done click
  • 在 Vue.js 中从父组件执行子方法

    目前 我有一个 Vue js 组件 其中包含其他组件的列表 我知道使用 vue 的常见方式是将数据传递给孩子 并从孩子向父母发出事件 但是 在这种情况下 我想在子组件中的按钮出现时执行子组件中的方法 parent被点击 哪种方法最好 一种建
  • 解析“流”JSON

    我在浏览器中有一个网格 我想通过 JSON 将数据行发送到网格 但浏览器应该在接收到 JSON 时不断解析它 并在解析时将行添加到网格中 换句话说 在接收到整个 JSON 对象后 不应将行全部添加到网格中 应该在接收到行时将其添加到网格中
  • 使用 useReducers 调度函数发送多个操作?

    使用时是否可以通过调度函数发送多个动作useReducer挂钩反应 我尝试向它传递一组操作 但这会引发未处理的运行时异常 明确地说 通常会有一个初始状态对象和一个减速器 如下所示 const initialState message1 nu
  • 使用 jQuery/JS 打开时使
    标签的内容具有动画效果

    我只想要 HTML5 的内容details标记为 滑行 动画打开 而不是仅仅弹出打开 立即出现 这可以用 jQuery Javascript 实现吗 Fiddle http jsfiddle net 9h4Hq HTML
  • 使用 Angular 下载具有动态 src 的脚本

    Angular 提供了通过动态名称动态加载模板的方法ng include 该部分中的内联 JS 和 CSS 可以正常加载 但没有一个好的方法来下载带有动态 url 的脚本 我们需要下载脚本 相对于调用它们的 html 部分的路径 即我们有一
  • 可以使用 jQuery 或 Javascript 将图片的特定部分用作链接吗?

    我有这个想法 将图片 而不是文本 的各个部分链接到不同的页面或网站 并且我想在不实际创建不同的照片并将它们彼此靠近的情况下完成 这样看起来就像是一张完整的图片 这里有人知道如何使用 JavaScript 的变体 例如 jQuery 或纯 J
  • 从未用 @flow 标记的导入文件中获取类型定义

    TL DR我怎么告诉flow从未声明的导入模块导入类型定义 flow 加长版 流接缝能够从不使用流语法的文件中派生类型 请参阅示例 示例文件 flow js if Math random lt 0 5 var y hello else va
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • JavaScript 重定向到新窗口

    我有以下代码 它根据下拉列表的值重定向到页面 我如何使其在新窗口中打开 function goto form var index form select selectedIndex if form select options index
  • 音频 blob 的 URL.createObjectURL 在 Firefox 中给出 TypeError

    我正在尝试从创建的音频 blob 创建对象 URLgetUserMedia 该代码在 Chrome 中可以运行 但在 Firefox 中存在问题 错误 当我打电话时stopAudioRecorder 它停在audio player src
  • HTML 离线应用程序缓存,列出下载的文件

    作为我正在构建的离线 Web 应用程序的加载屏幕的一部分 使用缓存清单 http developer apple com library safari documentation iPhone Conceptual SafariJSData
  • 如何获取给定 DOM 元素的所有定义的 CSS 选择器?

    如何使用 jQuery 获取给定 DOM 元素的所有定义的 CSS 选择器 定义后 我的意思是在应用于任何样式表的所有 CSS 选择器document 在某种程度上 这类似于 FireBug 实现的功能 其中显示所选 DOM 元素的所有应用
  • 在 vue.js 中访问数组对象属性

    给定以下数组vue js packageMaps Object packageMap 0 Object Id 16 PackageType flag list ProductCode F BannerBase packageMap 1 Ob
  • Javascript转换时区问题

    我在转换当前时区的日期时间时遇到问题 我从服务器收到此日期字符串 格式为 2015 10 09T08 00 00 这是中部时间 但是当我使用 GMT 5 中的 new Date strDate 转换此日期时间时 它返回给我的信息如下 这是不
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 简单的 Vue.js 计算属性说明

    我对 Vue js 并不陌生 但我会再次浏览文档 试图找出我第一次错过的任何内容 我在以下地方看到了这个声明使用计算属性的基本示例部分 https v2 vuejs org v2 guide computed html Basic Exam
  • 在 React.js 中编辑丰富的数据结构

    我正在尝试为数据结构创建一个简单的基于网格的编辑器 但我在使用 React js 时遇到了一些概念问题 他们的文档对此没有太大帮助 所以我希望这里有人可以提供帮助 首先 将状态从外部组件传输到内部组件的正确方法是什么 是否有可能将内部组件中
  • 导致回发到与弹出窗口不同的页面

    我有一个主页和一个详细信息页面 详细信息页面是从主页调用的 JavaScript 弹出窗口 当单击详细信息页面上的 保存 按钮时 我希望主页 刷新 是否有一种方法可以调用主页的回发 同时还可以从详细信息页面维护保存回发 Edit 使用win
  • 如何从图像输入中获取 xy 坐标?

    我有一个输入设置为图像类型

随机推荐

  • latex插图位置问题

    使用figure会进行浮动环境 这样插的图latex会自动调整 一般我们不需要这样的功能 可以使用 code begin figure h end figure code 或者使用 includegraphics 插入 如果列figure估
  • 【大数据】CDC 技术:变化数据捕获

    CDC 技术 变化数据捕获 1 什么是 CDC 2 批处理 vs CDC 3 四种 CDC 的实现方法 3 1 表元信息 Table metadata 3 2 表求差 Table differences 3 3 数据库触发器 Trigger
  • 华为OD机试-多个数组合并

    题目描述 现在有多组整数数组 需要将他们合并成一个新的数组 合并规则从每个数组里按顺序取出固定长度的内容 合并到新的数组 取完的内容会删除掉 如果改行不足固定长度 或者已经为空 则直接取出剩余部分的内容放到新的数组中继续下一行 输入描述 第
  • 关于《Python黑帽子:黑客与渗透测试编程之道》的学习笔记

    本篇文章是学习 Python黑帽子 黑客与渗透测试编程之道 的笔记 会持续地将书上的代码自己敲一遍 从而让自己对Python的安全编程有更多的了解 同时希望各位可以给给建议 不足之处太多了 第一章 设置Python环境 Kali Linux
  • 机器学习实战学习笔记(十三)利用SVD简化数据

    PS 该系列数据都可以在图灵社区 点击此链接 中随书下载中下载 如下 1 SVD的应用 奇异值分解 优点 简化数据 去除噪声 提高算法的结果 缺点 数据的转换可能难以理解 适用数据类型 数值型数据 1 1 隐形语义索引 最早的SVD应用之一
  • 并发测试异常[Address already in use: no futher infomation]

    前言 测试的同事反馈接口返回异常 如下 I O error on POST request for 接口地址 Address already in use connect nested exception is java net BindE
  • 动漫短视频在哪下载?3个网站教你快速找到

    动漫作为新兴的朝阳产业 受众群体越来越广 动漫短视频剪辑也越来越多 但很多人都有一个疑惑 动漫短视频在哪下载 素材怎么找呢 今天就给大家介绍一下 01 易撰 首先就是易撰 易撰视频库可以说是全网最全面的视频素材库了 包含了抖音 快手 美拍等
  • Mysql操作

    完成下面的操作 请写出修改表的SQL语句并运行 1 现要新增两个字段 籍贯和邮箱 A native 籍贯 数据类型为20位可变长字符串 放在性别列的后面 B email 邮箱 数据类型为50位可变长字符串 放在最后一列 2 设学生表stud
  • Golang笔记-大小写作用范围

    验证作用范围所使用的目录结构 其中main go内容如下 package main import encoding json fmt practice mulu1 practice mulu2 practice mulu4 1 即使mulu
  • Kubernetes入门学习-十九-网络配置插件flannel-01

    最近学习k8s遇到很多问题 建了一个qq群 153144292 交流devops k8s docker等 Kubernetes的网络模型和网络策略 Kubernetes网络模型和CNI插件 在Kubernetes中设计了一种网络模型 要求无
  • Redhat 设置北京时间

    Redhat 设置北京时间 系统版本 查看当前时间 修改时区 修改时间 系统版本 redhat 版本 6 5 wuxt localhost cat etc redhat release Red Hat Enterprise Linux Se
  • HiBlock社区:区块链链上数据的认知与探索

    跨界知识聚会系列文章 知识是用来分享和传承的 各种会议 论坛 沙龙都是分享知识的绝佳场所 我也有幸作为演讲嘉宾参加了一些国内的大型会议 向大家展示我所做的一些成果 从听众到演讲感觉是不一样的 把知识分享出来 你才能收获更多 关于作者 张丹
  • Pycharm常用快捷键及设置

    Pycharm 一 Pycharm常用快捷键 二 常用设置 1 代码提示忽略大小写敏感 2 滚轮缩放和自动换行 包括编辑栏和控制台 3 字体与代码配色 仅供参考 一 Pycharm常用快捷键 Ctrl 行注释 Ctrl D 复制选定的区域或
  • 【electron】应用在线升级

    流程 1 设置feedUrl 每次登录应用后更新feedUrl 如果需要灰度测试 可以添加uuid的参数 由服务端判断是否命中 注意 feedUrl需要在checkUpdate之前调用 主进程 初始化 private cancellatio
  • U3D客户端框架之 音效管理器 与 Fmod介绍安装导入Unity

    一 Fmod介绍与安装导入Unity 1 Fmod与Unity内置Audio播放器对比 Unity内置的Audio底层使用的是FMOD 但是功能不够齐全 高级一点的功能如混合 Mix 等无法使用 音效管理应该和Unity工程解耦合 这样子可
  • Python中处理异常和错误

    作为一种强大且灵活的编程语言 Python 提供了许多机制来处理程序运行过程中可能出现的异常和错误 本文将详细介绍如何在 Python 中以 优雅 高效 的方式进行异常处理 并提供实用技巧帮助开发者更好地应对各种情况 无论您是初学者还是有经
  • 单相桥式全控整流电路

    单相全控桥式带电阻负载时的电路 带电阻负载的工作情况 电路分析 闸管VT1和VT4组成一对桥臂 VT2和VT3组成另一对桥臂 在u2正半周 即a点电位高于b点电位 若4个晶闸管均不导通 id 0 ud 0 VT1 VT4串联承受电压u2 在
  • linux echo彩色打印

    定义了三个颜色 把打印的内容加载头和尾巴之间即可 pt head green 033 32 1m pt head red 033 31 1m pt head yellow 033 33 1m pt tail 033 0m echo pt h
  • STM32学习笔记-大小端模式详解

    最低有效字节在最前端的方式 小端法 最高有效字节在最前端的方式 大端法 小端模式 Little Endian 小端模式 Little Endian 也称为Intel顺序 最低有效字节 首先存储 例如 int16数据0x0123467在地址单
  • vue3:使用:图片生成二维码并复制

    实现在 vue3 中根据 url 生成一个二维码码 且可以复制 注 复制功能 navigator clipboard write 只能在安全的localhost 这种安全网络下使用 https中需要添加安全证书 且在域名 例 https w