生成二维码优惠券

Vue 生成二维码优惠券

 1、图标添加动画

  @keyframes go {
        0% {
           transform: rotateZ(0);
        }
        100% {
           transform: rotateZ(360deg);
        }
    }

 

结合vue的class动态绑定,当点击刷新时,class值改为活动,此时旋转,延时改为静止

 

HTML

<div class="bottom-button" @click="getNewQR">刷新</div>

 

Function

 // 获取二维码信息
    getNewQR() {
      this.refreash = true;
      this.BindQRCode();
      setTimeout(() => {
        this.refreash = false;
      }, 3000);
    },

 

animation

 .img-class {
          width: 16px;
          height: 16px;
          object-fit: cover;
          background-size: 100% !important;
          display: inline-block;
          margin: auto;
          background: url("#{$imgSpacename}/icon_refreash.png") no-repeat center;

          @keyframes go {
            0% {
              transform: rotateZ(0);
            }
            100% {
              transform: rotateZ(360deg);
            }
          }

          &.img-class-active {
            animation-name: go;
            animation-duration: 3s;
            animation-iteration-count: infinite;
          }
        }
      }

 

2、生成二维码

  首先安装生成二维码的依赖,在控制台执行

npm install qrcodejs2 --save

 

 在页面中导入依赖,并使用(二维码的本质就是一个链接)

import QRCode from "qrcodejs2";
.....
.....

 
 data() {
    return {
      qrcodeUrl: this.$route.query.qrcodeUr, //从路由中获取url参数
      ......  
    };
  }, 

  mounted() {
    this.BindQRCode();
     ......
  } ,

methods: {
 ......,

 BindQRCode() {
      document.getElementById("qrcode").innerHTML = "";
      new QRCode(this.$refs.qrCodeDiv, {
        text: `${this.qrcodeUrl}`,
        width: 245,
        height: 245,
        colorDark: "#333333", //二维码颜色
        colorLight: "#ffffff" //二维码背景色
        // correctLevel: QRCode.CorrectLevel.L //容错率,L/M/H
      });
    }
}

.....
.....

 

在生成二维码的过程中,遇到了一个问题就是二维码的追加,在我重新生成二维码时,新的二维码会追加到旧二维码的下方,查阅资料,找到了在每次生成二维码前先元素置空。

 document.getElementById("qrcode").innerHTML = "";

 

<template>
  <div class="qr">
    <div class="box">
      <div class="top">{{activityName}}</div>
      <div id="qrcode" ref="qrCodeDiv" class="BindQRCode"></div>
      <div class="box-bottom">
        <div class="pic-text">
          <i class="img-class" :class="{'img-class-active':refreash}"></i>
          <span>使用微信扫一扫领取券码</span>
        </div>
        <div class="bottom-button" @click="getNewQR">刷新</div>
      </div>
    </div>
    <div>
      <div class="more-detail" @click="goToMoreDetail">发放详情</div>
    </div>
  </div>
</template>

<script>
import { xxxs } from "../../api/api.js";
import QRCode from "qrcodejs2";

export default {
  data() {
    return {
      QR: "",
      refreash: false,
      qrcodeUrl: this.$route.query.qrcodeUrl,
      activityName: this.$route.query.activityName
    };
  },

  mounted() {
    this.BindQRCode();
  },

  created() {},

  methods: {
    goToMoreDetail() {
      this.$router.push({
        path: "/Givingout/GiveoutMoreDetail",
        query: {
          effectiveTime: this.$route.query.effectiveTime, // 券有效时长
        }
      });
    },

    // 获取二维码信息
    getNewQR() {
      this.refreash = true;
      this.BindQRCode();
      setTimeout(() => {
        this.refreash = false;
      }, 3000);
    },

    BindQRCode() {
      document.getElementById("qrcode").innerHTML = "";
      new QRCode(this.$refs.qrCodeDiv, {
        text: `${this.qrcodeUrl}`,
        width: 245,
        height: 245,
        colorDark: "#333333", //二维码颜色
        colorLight: "#ffffff" //二维码背景色
        // correctLevel: QRCode.CorrectLevel.L //容错率,L/M/H
      });
    }
  }
};
</script>

<style lang="scss" scoped>
.qr {
  position: absolute;
  top: 0px;
  bottom: 0px;
  left: 0px;
  right: 0px;
  background: linear-gradient(
    360deg,
    rgba(255, 255, 255, 1) 0%,
    rgba(50, 150, 250, 1) 100%
  );
  padding-top: 40px;

  .box {
    width: 325px;
    background: rgba(255, 255, 255, 1);
    margin: 5px auto;
    border-radius: 4px;
    padding: 20px 40px 30px;
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;

    .top {
      font-size: 18px;
      font-family: PingFangSC-Semibold, PingFang SC;
      font-weight: 600;
      color: rgba(51, 51, 51, 1);
      line-height: 18px;
    }

    .BindQRCode {
      margin: 20px 0px;
    }

    .box-bottom {
      display: flex;
      width: 100%;
      justify-content: space-between;
      align-items: center;

      .pic-text {
        display: flex;
        align-items: center;
        font-size: 14px;
        font-family: PingFangSC-Regular, PingFang SC;
        font-weight: 400;
        color: rgba(153, 153, 153, 1);
        line-height: 14px;

        .img-class {
          width: 16px;
          height: 16px;
          object-fit: cover;
          background-size: 100% !important;
          display: inline-block;
          margin: auto;
          background: url("#{$imgSpacename}/icon_refreash.png") no-repeat center;

          @keyframes go {
            0% {
              transform: rotateZ(0);
            }
            100% {
              transform: rotateZ(360deg);
            }
          }

          &.img-class-active {
            animation-name: go;
            animation-duration: 3s;
            animation-iteration-count: infinite;
          }
        }
      }

      .bottom-button {
        font-size: 16px;
        font-family: PingFangSC-Regular, PingFang SC;
        font-weight: 400;
        color: rgba(54, 151, 249, 1);
        line-height: 14px;
      }
    }
  }
  .more-detail {
    width: 180px;
    height: 40px;
    margin: 40px auto;
    background: rgba(50, 150, 250, 1);
    border-radius: 22px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 16px;
    font-family: PingFangSC-Regular, PingFang SC;
    font-weight: 400;
    color: rgba(255, 255, 255, 1);
    line-height: 16px;
  }
}
</style>

 

实际效果:

 

posted on 2022-03-01 11:44  zhishiyv  阅读(278)  评论(0编辑  收藏  举报

导航