Vue中两种生成二维码(带logo)并下载方式总结

 更新时间:2024年03月15日 08:26:27   作者:元素苏_  
与后端生成二维码相比,前端生成二维码更具有灵活性,下面这篇文章主要给大家介绍了关于Vue中两种生成二维码(带logo)并下载的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

1.现在需要在页面中生成一个二维码,并附带上公司的logo

生成的二维码需要显示logo,并且点击可以二维码可以下载保存,有两种方案供选择(vue-qr、qrcode

2.vue-qr库使用(方案一)

npm i vue-qr@4.0.9

我的nodejs版本12.13.0,大家可以使用cnpm下载更好。

html代码:

<template>
  <div class="main">
    <div>
      <vue-qr 
        :text="codeText"    
        :size="150"
        :margin="20"
        colorDark="#333"
        backgroundColor="#eee"
        :logoSrc="lgoImg"
        logoScale="0.21"
        logoMargin="25px"
        :callback="getCode"
      ></vue-qr>
    </div>
  </div>
</template>

JS代码:

<script>
import VueQr from 'vue-qr'
export default {
  name:'QR',
  components:{VueQr},
  data() {
    return {
      codeText: 'https://blog.csdn.net/yuansusu_?spm=1000.2115.3001.53',
      lgoImg: require('../assets/111.png'),
    };
  },
  methods: {
    getCode(codeImg) {
      console.log('二维码图片', codeImg);
    },
  }
}
</script>
  1. text是要生成的内容
  2. size表示二维码的宽高,宽高一致
  3. margin二维码图像的外边距, 默认 20px
  4. colorDark实点的颜色
  5. backgroundColor背景颜色(背景图片使用bgSrcgifBgSrc)
  6. logoSrc嵌入中间的logo地址
  7. logoScale用于计算 LOGO 大小的值, 过大将导致解码失败, LOGO 尺寸计算公式 logoScale*(size-2*margin), 默认 0.2
  8. logoMargin设置LOGO 标识周围的空白边框, 默认为0
  9. callback生成的二维码 Data URI 可以在回调中取得,第一个参数为二维码 data URL, 第二个参数为 props 传过来的 qid(因为二维码生成是异步的,所以加个 id 用于排序)

官网文档:vue-qr - npm(文档是中文,可以放心食用)

3.qrcode库使用并带下载方式(方案二)(推荐)

npm i qrcode@1.5.1

使用qecode配置的logo更为灵活,并且在不是vue项目中也能同样使用

html(部分)和css代码:

<div class="qr-code">
    <canvas 
      id="QRCode_header"
      ref="canvas"
      title="扫描二维码"
    ></canvas>
    <div class="mask-code" @click="saveCode">
      <i></i><span>保存二维码</span>
    </div>
</div>
<style scoped>
  .qr-code{
    display: flex;
    width:fit-content;
    width:-webkit-fit-content;
    width:-moz-fit-content;
    position: relative;
  }
  .qr-code:hover>div{
    z-index: 0;
  }
  .mask-code{
    position: absolute;
    width: 100%;
    height: 100%;
    background: rgba(0, 0, 0,0.4);
    display: flex;
    justify-content: center;
    align-items: center;
    cursor: pointer;
    z-index: -1;
  }
  .mask-code i{
    display: inline-block;
    width: 25px;
    height: 25px;
    background-image: url(../assets/save_img.png);
    background-size: cover;
  }
  .mask-code span{
    color: white;
  }
</style>

可以将上面的内容封装到组件中,通过props来传递想要生成的内容

JS代码:

<script>
import QRCode from "qrcode"; //引入生成二维码插件
export default {
  name:'CodeS',
  props:{
    canvasWidth:{
      default:200,
      type:Number
    },
    canvasHeight:{
      default:200,
      type:Number
    },
    url:{
      default:'',
      type:String,
      required:true
    },
    logoUrl:{
      default:'',
      type:String,
      // required:true
    }
  },
  methods:{
    getQRCode() {
      let opts = {
          errorCorrectionLevel: "H",//容错级别,指二维码被遮挡可以扫出结果的区域比例
          type: "image/png",//生成的二维码类型
          quality: 0.3,//二维码质量
          margin: 5,//二维码留白边距
          width: this.canvasWidth,//宽
          height: this.canvasHeight,//高
          text: "1111",//二维码内容
          color: {
              light: "#eaeaea"//背景色
          }
      };
      // 将获取到的数据(val)画到msg(canvas)上,加上时间戳动态生成二维码
      QRCode.toCanvas(this.$refs.canvas, this.url, opts, function (error) {
        if(error){
          console.log('加载失败!');
        }
      });
    },
    saveCode(){
      //下载二维码
      let base64Img =  this.$refs.canvas.toDataURL('image/jpg');
      //创建下载标签,然后设置链接和图片名称
      let a = document.createElement('a')
      a.href = base64Img
      a.download = '二维码'+Date.now()
      a.click()
      //销毁元素
      a.remove()
    }
  },
  mounted() {
    this.getQRCode()

    //设置logo图标
    if(this.logoUrl!= ''){
      let myCanvas = this.$refs.canvas
      let ctx = myCanvas.getContext('2d')
      // 在Canvas画布 添加图片
      let img = new Image()
      img.crossOrigin = 'Anonymous';//解决Canvas.toDataURL 图片跨域问题
      img.src = this.logoUrl;
      img.onload = ()=>{
        //第一个设置的元素,第二三是位置,后面两个是宽和高
        //居中的位置计算为 (二维码宽度-img宽度)/2
        let codeWidth = (this.canvasWidth *0.75)/2
        let codeHeight = (this.canvasHeight * 0.75)/2
        ctx.drawImage(img, codeWidth, codeHeight,this.canvasWidth*0.25,this.canvasHeight*0.25)
      }
    }
  },
}
</script>

errorCorrectionLevel纠错级别有四个:

  1. L(7%)
  2. M(15%)
  3. Q(25%)
  4. H(30%)

级别越高,logo占的大小就越大。

通过鼠标点击二维码,就可以将二维码保存在本地

文档地址:qrcode - npm(无中文)

总结

到此这篇关于Vue中两种生成二维码(带logo)并下载方式的文章就介绍到这了,更多相关Vue生成二维码带logo并下载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue多次循环操作示例

    vue多次循环操作示例

    这篇文章主要介绍了vue多次循环操作,结合实例形式分析了vue.js针对json嵌套数据的多次循环读取操作相关实现技巧,需要的朋友可以参考下
    2019-02-02
  • vue-router 导航完成后获取数据的实现方法

    vue-router 导航完成后获取数据的实现方法

    这篇文章主要介绍了vue-router 导航完成后获取数据,通过使用生命周期的 created() 函数,在组件创建完成后调用该方法,本文结合实例代码给大家讲解的非常详细需要的朋友可以参考下
    2022-11-11
  • Vue的Class与Style绑定的方法

    Vue的Class与Style绑定的方法

    本篇文章主要介绍了Vue的Class与Style绑定的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • vue自定义过滤器创建和使用方法详解

    vue自定义过滤器创建和使用方法详解

    这篇文章主要为大家详细介绍了vue自定义过滤器创建和使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Vue.js自定义指令学习使用详解

    Vue.js自定义指令学习使用详解

    这篇文章主要为大家详细介绍了Vue.js自定义指令的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • 利用Vue.js制作一个拼图华容道小游戏

    利用Vue.js制作一个拼图华容道小游戏

    这篇文章主要为大家详细介绍了如何利用Vue.js编写一个拼图华容道游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • vue项目实现国际化的基本思路与详细步骤

    vue项目实现国际化的基本思路与详细步骤

    国际化是指项目能够根据不同国家的语言进行转换,便于不同国家的用户使用,这篇文章主要给大家介绍了关于vue项目实现国际化的基本思路与详细步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • Vue引入高德地图实现流程分步讲解

    Vue引入高德地图实现流程分步讲解

    这篇文章主要介绍了Vue引入高德地图实现流程,实现步骤是通过vue的方法引入地图,初始化地图,设置宽和高,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • vue1.0和vue2.0的watch监听事件写法详解

    vue1.0和vue2.0的watch监听事件写法详解

    今天小编就为大家分享一篇vue1.0和vue2.0的watch监听事件写法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue组件tabbar使用方法详解

    vue组件tabbar使用方法详解

    这篇文章主要为大家详细介绍了vue组件tabbar使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11

最新评论