vue 生成二维码(中间logo),下载二维码,复制链接(vue + vue-qr+clipboard)

本文介绍了如何在Vue.js项目中使用vue-qr库生成二维码,并结合clipboard库实现在前端复制二维码链接的功能。首先通过npm安装vue-qr和clipboard依赖,然后在模板中引入并配置组件,展示二维码和复制按钮。代码示例展示了如何监听事件、复制链接和下载二维码图片的方法。最后,给出了实际应用中的效果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.导入二维码依赖

npm install vue-qr --save

https://www.npmjs.com/package/vue-qr

2.导入复制依赖

npm install clipboard --save

https://clipboardjs.com/

3.代码:

<template>
  <div class="shareDrawer">
    <drawer :display.sync="singleDialog" :width="'25%'">
      <div slot="title">
        <div class="drawer_title">
          <div class="title">{{ title }}</div>
          <div><i class="el-icon-close" @click="handleClose(() => {})" /></div>
        </div>
      </div>
      <div class="shareDrawer_coede">
        <!-- 二维码 -->
        <vue-qr
          ref="Qrcode"
          :correctLevel="3"
          :text="dataObj.text"
          :logoSrc="dataObj.logo"
          :callback="test"
          :size="250"
          :margin="10"
          colorDark="#191a23"
          colorLight="white"
          backgroundColor="white"
          backgroundDimming="white"
          :logoScale="0.2"
          :logoMargin="5"
          logoBackgroundColor="white"
          qid="testQrId"
        ></vue-qr>
      </div>
      <div class="text_color">
       <!-- 下载/复制 -->
        <a :href="exportLink" @click="downloadImg" :download="downloadFilename">
          <i class="el-icon-download" /> 下载二维码</a
        >
        <el-button
          class="tag-copy"
          type="text"
          icon="el-icon-document-copy"
          :data-clipboard-text="dataObj.text"
          @click="copyShareLink"
        >
          复制链接
        </el-button>
      </div>
    </drawer>
  </div>
</template>

<script>
import VueQr from "vue-qr"; // 生成二维码
import Clipboard from "clipboard"; // 复制

export default {
  components: { VueQr },
  
  props: {
  // 父组件传值 控制弹层开关的
    singleDialog: {
      type: Boolean,
      default: false
    },
   //父组件 带参传值 
    isObj: {
      type: Object,
      default: function() {
        return {};
      }
    }
  },
  
  data() {
    return {
      title: "分享二维码",
      dataObj: {
        text: "http://www.baidu.com",
        logo: require("@/assets/images/logo_1x1.png")
      },
      exportLink: "",
      downloadFilename: ""
    };
  },

  computed: {
    getObj() {
      if (
        typeof this.isObj === "object" &&
        Object.keys(this.isObj).length > 0
      ) {
        // 存在
        return true;
      } else {
        return false;
      }
    }
  },
  
  watch: {
    singleDialog(val, oldval) {
      if (val && val !== oldval) {
        this.singleDialoginfo = true;
        console.log("打开弹层");
        console.log("对象==>", this.isObj, "活动id==>", this.isObj.id);
      } else {
        this.singleDialoginfo = false;
      }
    }
  },

  mounted() {},

  methods: {
    // 复制链接
    async copyShareLink() {
      let clipboard = new Clipboard(".tag-copy");
      await clipboard.on("success", e => {
        this.$message({
          type: "success",
          message: "复制成功,请到微信打开!"
        });
        clipboard.destroy(); // 释放内存
      });
      clipboard.on("error", e => {
        this.$message({
          type: "warning",
          message: "该浏览器不支持自动复制!"
        }); // 不支持复制
        clipboard.destroy(); // 释放内存
      });
    },
    
    // 二维码 第一个参数为二维码 data URL, 第二个参数为 props 传过来的 qid
    test(dataUrl, id) {
      // console.log(dataUrl);
      // console.log(id);
    },
    
    // 下载二维码图片
    downloadImg() {
      let Qrcode = this.$refs.Qrcode;
      this.exportLink = Qrcode.$el.currentSrc;
      this.downloadFilename = "二维码";
    },
    
    // 关闭弹窗
    handleClose(fn) {
      if (fn) {
        fn();
      }
      this.$emit("close");
    }
  }
};
</script>

<style lang="scss" scoped>
.shareDrawer {
  .shareDrawer_coede {
    display: flex;
    justify-content: center;
    align-items: center;
    margin-top: 10px;
  }
  .text_color {
    margin-top: 15px;
    color: #606266;
    font-size: 14px;
    display: flex;
    justify-content: space-around;
    align-items: center;
    a {
      color: #409eff;
      &:hover {
        color: #1682e6;
      }
    }
  }
}
</style>

4.效果如下:
(logo图片我就打码了,不过设置logo图片尺寸不能太大,否则显示不出来)
在这里插入图片描述
二维码属性参考:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值