最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue中兩種生成二維碼(帶logo)并下載方式總結(jié)

 更新時(shí)間:2024年03月15日 08:26:27   作者:元素蘇_  
與后端生成二維碼相比,前端生成二維碼更具有靈活性,下面這篇文章主要給大家介紹了關(guān)于Vue中兩種生成二維碼(帶logo)并下載的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

1.現(xiàn)在需要在頁面中生成一個(gè)二維碼,并附帶上公司的logo

生成的二維碼需要顯示logo,并且點(diǎn)擊可以二維碼可以下載保存,有兩種方案供選擇(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是要生成的內(nèi)容
  2. size表示二維碼的寬高,寬高一致
  3. margin二維碼圖像的外邊距, 默認(rèn) 20px
  4. colorDark實(shí)點(diǎn)的顏色
  5. backgroundColor背景顏色(背景圖片使用bgSrcgifBgSrc)
  6. logoSrc嵌入中間的logo地址
  7. logoScale用于計(jì)算 LOGO 大小的值, 過大將導(dǎo)致解碼失敗, LOGO 尺寸計(jì)算公式 logoScale*(size-2*margin), 默認(rèn) 0.2
  8. logoMargin設(shè)置LOGO 標(biāo)識(shí)周圍的空白邊框, 默認(rèn)為0
  9. callback生成的二維碼 Data URI 可以在回調(diào)中取得,第一個(gè)參數(shù)為二維碼 data URL, 第二個(gè)參數(shù)為 props 傳過來的 qid(因?yàn)槎S碼生成是異步的,所以加個(gè) id 用于排序)

官網(wǎng)文檔:vue-qr - npm(文檔是中文,可以放心食用)

3.qrcode庫使用并帶下載方式(方案二)(推薦)

npm i qrcode@1.5.1

使用qecode配置的logo更為靈活,并且在不是vue項(xiàng)目中也能同樣使用

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>

可以將上面的內(nèi)容封裝到組件中,通過props來傳遞想要生成的內(nèi)容

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",//容錯(cuò)級別,指二維碼被遮擋可以掃出結(jié)果的區(qū)域比例
          type: "image/png",//生成的二維碼類型
          quality: 0.3,//二維碼質(zhì)量
          margin: 5,//二維碼留白邊距
          width: this.canvasWidth,//寬
          height: this.canvasHeight,//高
          text: "1111",//二維碼內(nèi)容
          color: {
              light: "#eaeaea"http://背景色
          }
      };
      // 將獲取到的數(shù)據(jù)(val)畫到msg(canvas)上,加上時(shí)間戳動(dòng)態(tài)生成二維碼
      QRCode.toCanvas(this.$refs.canvas, this.url, opts, function (error) {
        if(error){
          console.log('加載失??!');
        }
      });
    },
    saveCode(){
      //下載二維碼
      let base64Img =  this.$refs.canvas.toDataURL('image/jpg');
      //創(chuàng)建下載標(biāo)簽,然后設(shè)置鏈接和圖片名稱
      let a = document.createElement('a')
      a.href = base64Img
      a.download = '二維碼'+Date.now()
      a.click()
      //銷毀元素
      a.remove()
    }
  },
  mounted() {
    this.getQRCode()

    //設(shè)置logo圖標(biāo)
    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 = ()=>{
        //第一個(gè)設(shè)置的元素,第二三是位置,后面兩個(gè)是寬和高
        //居中的位置計(jì)算為 (二維碼寬度-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糾錯(cuò)級別有四個(gè):

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

級別越高,logo占的大小就越大。

通過鼠標(biāo)點(diǎn)擊二維碼,就可以將二維碼保存在本地

文檔地址:qrcode - npm(無中文)

總結(jié)

到此這篇關(guān)于Vue中兩種生成二維碼(帶logo)并下載方式的文章就介紹到這了,更多相關(guān)Vue生成二維碼帶logo并下載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue router重定向redirect如何傳值問題

    Vue router重定向redirect如何傳值問題

    這篇文章主要介紹了Vue router重定向redirect如何傳值問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Vant picker 多級聯(lián)動(dòng)操作

    Vant picker 多級聯(lián)動(dòng)操作

    這篇文章主要介紹了Vant picker 多級聯(lián)動(dòng)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • vue中配置scss全局變量的步驟

    vue中配置scss全局變量的步驟

    這篇文章主要介紹了vue中配置scss全局變量的步驟,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2020-12-12
  • 詳解vuex中mutation/action的傳參方式

    詳解vuex中mutation/action的傳參方式

    這篇文章主要介紹了詳解vuex中mutation/action的傳參方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • Vue3.0 自己實(shí)現(xiàn)放大鏡效果案例講解

    Vue3.0 自己實(shí)現(xiàn)放大鏡效果案例講解

    這篇文章主要介紹了Vue3.0 自己實(shí)現(xiàn)放大鏡效果案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Vite配置路徑別名的簡單實(shí)現(xiàn)方法

    Vite配置路徑別名的簡單實(shí)現(xiàn)方法

    Vite項(xiàng)目中我們可以手動(dòng)將src路徑設(shè)置**@**路徑別名,可以省下很多引入路徑的冗余路徑,下面這篇文章主要給大家介紹了關(guān)于Vite配置路徑別名的簡單實(shí)現(xiàn)方法,需要的朋友可以參考下
    2023-04-04
  • 關(guān)于vuex強(qiáng)刷數(shù)據(jù)丟失問題解析

    關(guān)于vuex強(qiáng)刷數(shù)據(jù)丟失問題解析

    這篇文章主要介紹了關(guān)于vuex強(qiáng)刷數(shù)據(jù)丟失問題解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • webpack如何打包一個(gè)按需引入的vue組件庫

    webpack如何打包一個(gè)按需引入的vue組件庫

    在vue項(xiàng)目開發(fā)中,我們會(huì)將經(jīng)常用到的邏輯或模塊抽象成組件,對于那些多個(gè)項(xiàng)目都有用到的組件,可以考慮封裝成組件庫,這篇文章主要給大家介紹了關(guān)于webpack如何打包一個(gè)按需引入的vue組件庫的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Vue實(shí)現(xiàn)點(diǎn)擊按鈕進(jìn)行上下頁切換

    Vue實(shí)現(xiàn)點(diǎn)擊按鈕進(jìn)行上下頁切換

    這篇文章主要介紹了Vue實(shí)現(xiàn)點(diǎn)擊按鈕進(jìn)行上下頁的切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • vue.js實(shí)現(xiàn)只彈一次彈框

    vue.js實(shí)現(xiàn)只彈一次彈框

    本篇文章通過代碼實(shí)例給大家詳細(xì)講述了一個(gè)vue的實(shí)例,實(shí)現(xiàn)只彈一次彈框功能,一起學(xué)習(xí)分享下。
    2018-01-01

最新評論

东安县| 博罗县| 嘉定区| 阳江市| 北川| 晋中市| 泰宁县| 泌阳县| 临沧市| 贡山| 曲麻莱县| 墨玉县| 乌兰察布市| 东乌珠穆沁旗| 赣榆县| 肃宁县| 通城县| 旅游| 通州市| 霸州市| 兰州市| 张家川| 辽阳县| 林口县| 临西县| 巫溪县| 莱州市| 景宁| 威海市| 常德市| 潞城市| 广安市| 武川县| 淄博市| 沽源县| 乌鲁木齐市| 五家渠市| 龙山县| 临夏市| 西林县| 灵山县|