Vue生成二维码组件封装

2023-11-12

1、使用方法

1.1、载入 JavaScript 文件

<script src="qrcode.js"></script>

1.2、调用

// 简单方式
new QRCode(document.getElementById('qrcode'), 'your content');

// 设置参数方式
var qrcode = new QRCode('qrcode', {
  text: 'your content',
  width: 256,
  height: 256,
  colorDark : '#000000',
  colorLight : '#ffffff',
  correctLevel : QRCode.CorrectLevel.H
});

// 使用 API
qrcode.clear();
qrcode.makeCode('new content');

1.3、参数说明

1.3.1、new QRCode(element, option)

名称

默认值

说明

element

-

显示二维码的元素或该元素的 ID

option

参数配置

option 参数说明

名称

默认值

说明

width

256

图像宽度

height

256

图像高度

typeNumber

4

colorDark

"#000000"

前景色

colorLight

"#ffffff"

背景色

correctLevel

QRCode.CorrectLevel.L

容错级别,可设置为:

QRCode.CorrectLevel.L

QRCode.CorrectLevel.M

QRCode.CorrectLevel.Q

QRCode.CorrectLevel.H

API接口

名称

说明

makeCode(text)

设置二维码内容

clear()

清除二维码。(仅在不支持 Canvas 的浏览器下有效)

2、安装qrcodejs2

npm install qrcodejs2 –save
// 或
yarn add qrcodejs2

3、初步封装组件

<!--
 * @Descripttion: 
 * @version: 
 * @Author: AowCt <awoct10@163.com>
 * @Date: 2021-05-12 14:03:44
 * @LastEditors: AowCt <awoct10@163.com>
 * @LastEditTime: 2021-07-13 11:20:45
-->
<template>
    <div class="wechat staff-doctor ui-top-main-bj">
        <div class="QRcode">
           <svg-icon icon-class="icon-QRcode" @click="clickQRcode"/>
           <div>查看二维码</div>
        </div>
        <div class="qrcode" ref="qrcode"></div>
        <van-popup 
            v-model="showQRcode" 
            class="qrcode_box"
            closeable 
            close-on-click-overlay>
            <img class="qrcode_img" :src="qrcodeHref" alt="" srcset="">
            <div>医生专属二维码</div>
        </van-popup>
    </div>
</template>

<script>
import { Skeleton, List, PullRefresh, Popup} from 'vant';
import { getThousandNum } from '@/utils/utils.js';
import QRCode from 'qrcodejs2'
export default {
    components: {
        [Skeleton.name]: Skeleton,
        [List.name]: List,
        [PullRefresh.name]: PullRefresh,//下拉刷新
        [Popup.name]: Popup
    },
    data() {
        return {
            medicalId: null,
            loading: false,
            listData:[],
            showQRcode: false,
            qrcode: null,
            qrcodeHref: null
        }
    },
    created() {
        this.medicalId = this.$route.query.id ? this.$aseDecode(this.$route.query.id,this.$constJs.doctorId) : null
    },
    methods: {
        clickQRcode() {
            this.showQRcode = !this.showQRcode
            this.$nextTick(function(){
                //这里写方法
                if (this.showQRcode) {
                    this.createQrCode(this.$refs.qrcode, this.doctorData.type);
                }
            });
        },
        createQrCode(qrstr, type){
            //创建二维码
            let _url = `${window.location.origin}?id=${this.medicalId}`
            if(type == 'heart'){
                _url += `&classify=heart`
            }
            if (this.qrcode == null) {
                this.qrcode = new QRCode(qrstr,{
                    width: 400,
                    height: 400,
                    text: _url
                    // background: '#f0f',
                // foreground: '#ff0'
                })
                let timer = setTimeout(() => {
                    // const img = qrstr.querySelector("img");
                    const canvas = document.getElementsByTagName("canvas")[0];
                    var ctx = canvas.getContext("2d");
                    var img = new Image;
                    // 获取图片地址
                    img.src = require('@/images/mailiu_logo.jpg')

                    // 开启跨域支持
                    img.crossOrigin = "*";

                    // 开始绘制的横坐标
                    var x = 140;
                    // 开始绘制的纵坐标
                    var y = 140;
                    // 绘制的宽度
                    var width = 120;
                    // 绘制的高度
                    var height = 120;
                    // 图片加载完成后执行
                    img.onload = () => {
                        ctx.beginPath();
                        //  ctx.arcTo(x + w, y, x + w, y + h, r);
                        ctx.arc(200, 200, 80, 0, Math.PI * 2);
                        // ctx.fillStyle('#ffffff')
                        // ctx.fill()//保证图片无bug填充
                        ctx.clip();//画了圆 再剪切 原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内
                        // 绘制图片
                        ctx.drawImage(img, x, y, width, height);
                        ctx.restore();
                        ctx.closePath();
                        this.qrcodeHref = canvas.toDataURL("image/png");
                        clearTimeout(timer)
                    }
                }, 100);
            }
        }
    },
}
</script>

<style lang="less">
.wechat{
    &.staff-doctor{
        .van-popup__close-icon--top-right{
            top: 0.2rem;
            right: 0.2rem;
            font-size: 0.38rem;
            color: #474747;
        }
        .qrcode{
            display: none;
            .qrcode_icon{
                width: 84px;
                height: 84px;
                border-radius: 12px;
                border: 1px solid blue;
            }
        }
        .qrcode_box{
            width: 4.8rem;
            height: 5.86rem;
            color: #878787;
            font-size: 0.3rem;
            text-align: center;
            line-height: 0.7rem;
            border-radius: 0.12rem;
            .qrcode_img{
                width: 3.8rem;
                height: 3.8rem ;
                margin: 0 auto;
                margin-top: 0.9rem;
                margin-bottom: -0.03rem;
            }
        }
    }
}
</style>
<style lang="less" scoped>
.wechat{
    &.staff-doctor{
        &.wechat.ui-top-main-bj{
            background-size: 100% 3.76rem;
                .QRcode{
                    font-size: 0.26rem;
                    .svg-icon{
                        font-size: 0.68rem;
                    }
                }
            }
        }
    }
}
</style>

4、二维码效果

 

 

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

Vue生成二维码组件封装 的相关文章

  • Chart.js 在初始化时设置活动段

    我正在使用 Chart js v2 并且尝试在加载图表时模拟圆环图上某个段的 悬停状态 因此看起来有一个部分已突出显示 我已经搜索和梳理了代码一天 但找不到一个好的方法来做到这一点 提前致谢 设置片段的悬停样式有点令人困惑 因为它没有真正记
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • 以编程方式填写reactjs表单

    我正在编写一个用户脚本 但无法填写由reactjs制作的表单 我的代码 document querySelector id username value email protected cdn cgi l email protection
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • 如何将函数附加到弹出窗口关闭事件(Twitter Bootstrap)

    我做了一些搜索 但我只能认为我可以将事件附加到导致其关闭的按钮 https stackoverflow com questions 13205103 attach event handler to button in twitter boo
  • 将 GMT 时间转换为当地时间

    我以这种格式从我的服务器获取 GMT 时间 Fri 18 Oct 2013 11 38 23 GMT 我的要求是使用Javascript将此时间转换为本地时间 例如 如果用户来自印度 首先我需要采用时区 5 30并将其添加到我的服务器时间并
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • 使用 CSS 或 Javascript 填充动画

    我只是想知道是否可以使用 CSS 或 javascript 创建填充动画 基本上我想创建一个填充动画 如下图所示 http i40 tinypic com eit6ia png http i40 tinypic com eit6ia png
  • 在 HTML5 画布中,如何用我选择的背景遮盖图像?

    我试图用画布来实现这一点 globalCompositeOperation 但没有运气 所以我在这里问 这里有类似的问题 但我没有在其中找到我的案例 我的画布区域中有图层 从下到上的绘制顺序 画布底座填充纯白色 fff 用fillRect
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • 可以设置标题样式吗? (并且使用CSS或js?)[重复]

    这个问题在这里已经有答案了 我想知道是否可以设计一个title a href title This is a title Hello a 样式问题有两个方面 文本格式 编码 我猜这是可能的 所以在问题中这样做 工具提示样式 你能把它弄大一点
  • 从数据库检查数据的异步解决方案各种循环子句

    我想要做的是异步检查数据库并从中获取结果 在我的应用程序中我试图实现Asynchronously将此步骤解决为 从数据库中检查手机号码JsonArray循环子句的种类 Create JsonArray从结果 打印创建的数组 我学到了足够多的
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 如何隐藏/禁用 Highcharts.js 中的图例框?

    我想问是否可以使用 HighCharts js 库隐藏图表中的所有图例框 var chart object chart renderTo render to type graph type colors graph colors title
  • 将 CKEditor 5 与 nuxtjs 结合使用

    我正在尝试在我的 Nuxtjs 项目中导入 CKEditor 5 的自定义版本 并且我已经尝试了所有可能的方法来正确导入它 但没有一个对我有用 这是其中之一 let ClassicEditor let CKEditor if process
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • 如何在执行新操作时取消先前操作的执行?

    我有一个动作创建器 它会进行昂贵的计算 并在每次用户输入内容时调度一个动作 基本上是实时更新 但是 如果用户输入多个内容 我不希望之前昂贵的计算完全运行 理想情况下 我希望能够取消执行先前的计算并只执行当前的计算 没有内置功能可以取消Pro

随机推荐

  • Android 源码分析 - 系统 - Settings

    core 源代码 core java android provider Settings java 定义一系列配置项名称 索引 常量 SettingsProvider apk 源代码位于 frameworks base packages S
  • 【Vuex入门】——(四)Mutation

    一 Mutation的作用 更改 Vuex 的store 中的状态的唯一方法是提交 mutation Vuex 中的 mutation 非常类似于事件 每个 mutation 都有一个字符串的 事件类型 type 和 一个 回调函数 han
  • Python语言程序设计 习题6

    一 选择题 1 下列Python数据中其元素可以改变的是 A A 列表 B 元组 C 字符串 D 数组 2 表达式 2 in 1 2 3 4 的值是 D A Yes B No C True D False print 2 in 1 2 3
  • python是什么意思中文、好学吗-零基础学python难吗?好学吗?

    Python是一种什么语言 Python是一种计算机程序设计语言 你可能已经听说过很多种流行的编程语言 比如非常难学的C语言 非常流行的Java语言 适合初学者的Basic语言 适合网页编程的JavaScript语言等 Python是他们其
  • 如何使用下标遍历二维数组

    点击打开链接 int my 2d array 10 10 假定数组my 2d array 已经预先被填充了数据 int i j 遍历这个数组 for i 0 i lt 10 i 向下遍历各行 for j 0 j lt 10 j 穿越各列 p
  • Python:Unused import statement 解决方法

    Python 学习 21052501 1 Unused import statement 解决方法 Pycharm file 菜单下有Invalidate caches Restart菜单栏 点击清除缓存重新启动Pycharm即可 2 In
  • 反思深度学习与传统计算机视觉的关系

    来源 算法与数学之美 某种程度上 深度学习最大的优势就是自动创建没有人会想到的特性能力 如今 深度学习在众多领域都有一席之地 尤其是在计算机视觉领域 尽管许多人都为之深深着迷 然而 深网就相当于一个黑盒子 我们大多数人 甚至是该领域接受过培
  • 【C++进阶】二叉搜索树递归与非递归的模拟实现(附源码)

    一 什么是二叉搜索树 二叉搜索树又称二叉排序树 它或者是一棵空树 或者是具有以下性质的二叉树 根据二叉搜索树的性质 它的中序遍历结果就是一个升序列 二 二叉搜索树的模拟实现 节点 Node 在实现二叉搜索树之前 要先定义一个节点 成员变量包
  • Shiro权限框架-在线并发登录人数控制(9)

    1 实现原理 在实际开发中 我们可能会遇到这样的需求 一个账号只允许同时一个在线 当账号在其他地方登陆的时候 会踢出前面登陆的账号 那我们怎么实现 自定义过滤器 继承AccessControlFilter 使用redis队列控制账号在线数目
  • 基于Directshow的H.264流媒体播放器设计

    0引言 DirectsHow应用框架完成了流媒体处理的底层工作 使得编程者无需关心数据如何输入 以及处理完后如何输出 而只需关心如何对输入数据进行处理 H 264视频编解码标准具有高压缩比和优良的网络亲和性 被普遍认为是最有影响力的流媒体视
  • 变分推断

    变分推断 MATLAB实现变分贝叶斯蒙特卡洛模拟的贝叶斯推断 目录 变分推断 MATLAB实现变分贝叶斯蒙特卡洛模拟的贝叶斯推断 效果一览 基本介绍 研究内容 模型描述 模型设计 参考资料 效果一览 基本介绍 MATLAB实现变分贝叶斯蒙特
  • input输入框获取焦点之后,显示搜索记录下拉表,点击其他地方搜索记录框消失

    给input框绑定一个focus事件 获取焦点时给全局绑定一个点击事件 判断下次点击的地方在不在输入框和下拉框内 不在则下拉框消失 记得清除这个点击事件 具体代码如下 处理搜索框获取焦点 handleInputSearch this isO
  • elementui中多个table同步滚动

    问题描述 element admin中同时使用多个table 要求头部固定 给每个并列的table设置max height 通过监听一侧的table滚动情况去控制另外一侧的table滚动 问题分析 table分成两部分 左侧是一个table
  • 用python画基本初等函数的图像(未完成)

    要用到matplotlib库 一 绘制 y x 图像 import numpy as np import matplotlib pyplot as plt x np linspace 50 50 200 定义x的范围为 50到50 分为20
  • UVA-11059 最大乘积 题解答案代码 算法竞赛入门经典第二版

    GitHub jzplp aoapc UVA Answer 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 数据量不大 暴力即可 include
  • 【AI】《动手学-深度学习-PyTorch版》笔记(二十):图像增强、微调

    AI学习目录汇总 1 图像增强 图像增强可以扩展训练样本数量 减小对某个属性的依赖 比如 裁剪图像 可以减少模型对对象出现位置的依赖 调整亮度 颜色等因素来降低模型对颜色的敏感度等 1 1 准备工作 头文件 matplotlib inlin
  • 01C++11多线程编程之thread,join,detach,joinable以及简说detach传引用地址的大坑

    01C 11多线程编程之thread join detach joinable以及简说detach传引用地址的大坑 1 thread类对象创建线程与join回收线程 1 thread创建线程很简单 定义一个对象然后传一个可调用对象即可 可调
  • Java反射机制【看这一篇就够啦!!!】

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于反射机制的相关操作吧 目录 Welcome Huihui s Code World 一 是什么 二 为什么要使用 三 怎么使用 辉辉小贴士 什么是Class类
  • 数字电路设计之同步电路的一些经验

    在设计的过程中 异步复位电路对硬件要求更低 更容易实现 但是使用同步复位电路却有着诸多优点 使得在实际的工业设计中更多使用的是同步复位电路 使用同步电路一般有以下好处 第一个就是避免毛刺 使用逻辑电路就一定会有毛刺 使用同步电路就有效避免毛
  • Vue生成二维码组件封装

    1 使用方法 1 1 载入 JavaScript 文件 1 2 调用 简单方式 new QRCode document getElementById qrcode your content 设置参数方式 var qrcode new QRC