vue 项目中 自动生成 二维码
vue 项目中 自动生成 二维码
最近在写一个vue项目,要求根据卡号可以自动生成一个二维码,并渲染在指定位置,因为第一次做类似业务,小编在网上找了找,发现了很多,具体起来主要用的就两种:
- QRcode
- vue-qr
vue-qr比QRcode功能多在可以在中间加logo,而且好像更方便一点,具体的 小编也没试,小编需要的二维码不需要那么 多骚操作,就选择了第一种,至于要写这篇博客的目的是为说一下,运用中遇到的问题及解决方法。
下面先介绍QRcode
vue里安装qrcodejs的npm包
npm install qrcodejs2 -save -s // 上线需要的包,打包的时候也会打包
页面引用
import QRCode from 'qrcodejs2' // 直接在需要用的页面 写就行不需要注意路径问题
二维码展示的盒子
<div class="qrcode" ref="qrCodeUrl" id="qrcode"></div>
methods: {creatQrCode() {var qrcode = new QRCode(this.$refs.qrCodeUrl, { // 这里选择器也可以直接写 'qrcode' 用的是id选择器 指示不需要带 # 而已text: 'xxxx', // 生成二维码的 内容width: 100, // 宽 单位 pxheight: 100, // 高 单位 px // render: 'canvas' // 设置渲染方式(有两种方式 table和canvas,默认是canvas) // background: '#f0f' // foreground: '#ff0' correctLevel: QRCode.CorrectLevel.H // 二维码容错 级别})}
},mounted() {this.creatQrCode(); // 这里会是一个重点,下面会解释}
点击下载二维码:
// 点击下载app二维码downloadAppCodeImg (name) {var canvasData = this.$refs.qrcode.getElementsByTagName('canvas')var a = document.createElement("a");var event = new MouseEvent("click"); // 创建一个单击事件a.href = canvasData[0].toDataURL("image/png");;a.download = "drcQrcode";a.dispatchEvent(event); // 触发a的单击事件},
好了,现在就可以了 简单吧? 当然这只是正常的情况,也是官网上介绍的用法,实际上 ,你会遇到一个错误例如:
### vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in v-on handler: "TypeError: Cannot read property 'appendChild' of null"### found in### ---> <Home> at src/script/view/home.vue### <ScrollBar> at src/script/component/scroll_bar.vue### <Frame> at src/script/component/frame.vue### <App> at src/script/App.vue### <Root>
### warn @ vue.runtime.esm.js?2b0e:619
### logError @ vue.runtime.esm.js?2b0e:1884
### globalHandleError @ vue.runtime.esm.js?2b0e:1879
### handleError @ vue.runtime.esm.js?2b0e:1839
### invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1862
### invoker @ vue.runtime.esm.js?2b0e:2179
### original._wrapper @ vue.runtime.esm.js?2b0e:6911
### vue.runtime.esm.js?2b0e:1888 TypeError: Cannot read property 'appendChild' of null### at new Drawing (qrcode.js?d044:370)### at new QRCode (qrcode.js?d044:579)### at VueComponent.creatQrCode (home.vue?afc8:120)### at VueComponent.dianJiZhanShi (home.vue?afc8:175)### at invokeWithErrorHandling (vue.runtime.esm.js?2b0e:1854)### at HTMLAnchorElement.invoker (vue.runtime.esm.js?2b0e:2179)### at HTMLAnchorElement.or
看到这个报错是不是第一印象 就是 appendChild 未定义就使用了? 所以我 全局搜索发现 没有这个字段;
接下来 你仔细 看 发现 它是定义在 qrcode.js 里面的 ,我怀疑是引入 js 造成 的 ,所以我又 手动引入一次 把它相对的路径都 写了进来,发现 还是报错; 思考之后又怀疑是生命周期函数的原因 ,因为 created 函数在 data 已有 DOM 还没有创建完成 ,可能会造成它找不到要插入的 DOM元素,所以我再次 把函数调用放在了 mounted
函数里面 ,mounted 生命周期函数中 页面已经渲染完成,DOM 节点也已经创建,应该是没问题的,结果还是报错; 后来我干脆把它放在了methods 一个 函数里面去调用,发现点击的时候还是报同样的错。 我就意识到,是我有一部分没意识到,或者说给忽略了。 我 仔细研究后发现
// this.$nextTick (function () {// this.creatQrCode(); // 这个函数 要在 this.$nextTick 里面调用 才不会报错// })
当然 我这里还有点波折 ,我的HTML 元素 也就是上面的
是在 一个遮盖层的 组件只能存在的,点击的时候才显示这个遮盖层,所以在生命周期函数里面,调用这个函数哪怕配合使用 this.$nextTick 调用也是不合适的。
希望 我的经验能帮到你
nextTick 简单介绍
下面是我的代码关于二维码的这一部分
<!-- 二维码遮盖层 --><div class="homeStyle"><van-popup v-model="show"><div class="qrcode" ref="qrCodeUrl" id="qrcode"> </div></van-popup></div>
import {DropdownItem,DropdownMenu,Grid,GridItem,Icon,Popup,Radio,RadioGroup,Swipe,SwipeItem,Tabbar,TabbarItem} from 'vant'import store from 'store'import Vue from 'vue'import axios from 'axios'import QRCode from 'qrcodejs2'
// 生成二维码函数creatQrCode() {let cardNo = store.get('__cardNo__')log.info(cardNo,'二维码生成')var qrcode = new QRCode('qrcode', {text: cardNo ,width: 150,height: 150,// background: '#f0f', // 背景色// foreground: '#ff0' // 前景色})// log.info(qrcode,'qrcode66666666666666666666666666') },dianJiZhanShi () {// this.creatQrCode();// 点击展示二维码this.show = !this.showthis.$nextTick (function () {this.creatQrCode();})},
下面补充一点知识:
微信长按识别二维码,在 vue 项目中的实现
微信长按识别二维码是 QQ 浏览器的内置功能,该功能的基础一定要使用 img 标签引入图片,其他方式的二维码无法识别。
在 vue 中使用 QrcodeVue 插件
- demo1 在 template 标签中直接使用
<qrcode-vue :value="codeUrl" :size="size" level="H"></qrcode-vue>
在微信中长按无法识别二维码
正确的做法
使用 qrcode 插件
- 在 template 标签中是使用 img 标签引入
<template><div><p>长按识别二维码支付</p><div id="code"><img class="code" :src="url" alt=""></div></div>
</template>
- 在 methods 方法里面生成二维码图片后加入 img 中即可
methods: {QRCode.toDataURL('自定义的内容,可传参').then(url => {this.url = url}).catch(err => {console.error(err)})
}
vue 项目中 自动生成 二维码相关推荐
- vue项目中自动生成二维码
vue项目中自动生成二维码 我们在做vue项目时,很多时候要用到生成二维码的功能,今天给大家介绍一个有前端生成二维码的小例子: 1.安装vue-qr: npm isntall vue-qr --sav ...
- vue项目使用qrcodejs2生成二维码
1.安装 cnpm i qrcodejs2 -S 2.使用 template文件 <!-- 二维码弹框 --> <el-button type="primary" ...
- vue项目中批量打印二维码
前提:项目中要打印的二维码为后台返回,批量选择后,点击打印,先打开二维码预览界面,再执行打印. 以下代码中 codePicList为选中的二维码数组.重点css:page-break-after:al ...
- vue根据链接自动生成二维码QRCode
1.安装 npm install qrcodejs2 2.引入页面 import QRCode from 'qrcodejs2' 3.代码使用 template: <div class=&quo ...
- 在UniApp的H5项目中,生成二维码和扫描二维码的操作处理
- 【在web项目jsp页面自动生成二维码功能】
在web项目jsp页面自动生成二维码功能 原文: http://www.cnblogs.com/gczmn/. https://www.jq22.com/jquery-info294/. 先将下面的文 ...
- Vue移动端H5生成二维码功能(qrcodejs2)
相信大家都遇到或是做过生成二维码的功能需求,现在针对vue移动端方法作简单介绍 1.安装.引用二维码插件 # 通过 npm 安装 npm i qrcodejs2 # 通过 yarn 安装 y ...
- 最强打包插件,支持fir,蒲公英上传, 360加固 ,自动生成二维码
文章目录 序言 说明 效果 使用 下载demo 导入文件 文件内容说明 配置gradle 配置gradle.properties 文件位置 内容 项目中配置 补充说明 1.360加固配置 2.curl ...
- 简单的二维码生成接口,自动生成二维码,返回图片地址
自动生成二维码,返回图片地址 本来不想写的,但是怕太久不写这个东西,就要荒废了,就先记录一下简单的东西 这里因为,返回地址的时候,通过了nginx ,我试了很多方法都抓取不到对应的IP地址, 就在ng ...
最新文章
- ASP.NET MVC:WebPageBase.cs
- 算法--06年华为面试:求两个数组的最小差值(Java实现)
- c#如何通过ftp上传文件_定时上传文件到ftp,如何使用工具定时上传文件到ftp
- 多线程与高并发(六):线程池可用的各种高并发容器详解:CopyOnWriteList,BlockingQueue等
- 专业对不对口重要吗_应届生求职,专业对口到底重不重要?
- 【机器学习】opencv-人脸识别
- linux上的定时器上的jiffies,Linux kernel -- 定时器/jiffies
- EF中报错:附加类型“xxxx”的实体失败,因为相同类型的其他实体已具有相同的主键值。
- 通过Python让数据产生价值,做到这4个字就够了
- s 修饰符:dotAll 模式
- Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.4.4 延迟初始化的bean...
- java生日验证_Java验证身份证号码是否有效
- max(X,Y),min(X,Y)的期望求解
- STCMCU各系列里程碑的进化
- 2014世界杯分组揭晓
- Winform2、(C#) 设置编译后.exe执行文件的图标
- 【洛谷 P3191】 [HNOI2007]紧急疏散EVACUATE(二分答案,最大流)
- 分销的智能变局,华为好望云服务的铁索连环
- Android SIM 主要流程
- php每四位隔开,php数字每三位加逗号的功能函数