vue 移动端开发实现点击复制的功能

前言

使用开源项目 clipboard.js, 官网:https://clipboardjs.com/

这个插件复制的对象必须是input 或者 textarea 里面的值。所以说你要是想复制p标签或者其他文本
必须先设置一个input或者textarea作为中间过渡。html中写一个textarea标签,样式设置: opacity:0;
z-index=-1;这样就可使隐藏这个没用的容器。

使用步骤

1.下包

1.下包:可以通过npm安装,npm install clipboard.js --save-dev

2.导包

代码如下(示例):

import Clipboard from 'clipboard'

3.代码

html代码:

 <div class="code-box">
      <p class="code-num" id="codeNum">AE86123456</p>
      <textarea id="input"></textarea>
      <p class="code-btn copy" @click="copy" id="codeBtn" data-clipboard-target="#input">复制邀请码</p>
    </div>

js代码:

 copy () {
      var clipboard = new Clipboard('.btn')
      // let e = document.getElementById('codeNum').innerText
      let t = document.getElementById('input')
      t.value = this.code
      clipboard.on('success', e => {
        console.log('复制成功', e)
        this.$toast.success({
          message: '复制成功'
        })
        // 释放内存
        clipboard.destroy()
      })
      clipboard.on('error', e => {
        // 不支持复制
        this.$toast.fail({
          message: '手机权限不支持复制功能'
        })
        console.log('该浏览器不支持自动复制')
        // 释放内存
        clipboard.destroy()
      })
    }

完整代码:复制即可用

<template>
  <div class="myTicket">
    <div class="content">
      <div class="title">
        <span>任务名称</span>
        <span>任务状态</span>
        <span>奖品</span>
      </div>
      <div class="list">
        <van-row class="list-item">
          <van-col span="8">
            报名课程
          </van-col>
          <van-col span="8">已完成</van-col>
          <van-col span="8"
            >5元券
            <van-button
              class="btn"
              :color="colorObj[0]"
              type="info"
              round
              size="mini"
              >{{ isGetObj[0] }}</van-button
            >
          </van-col>
        </van-row>
        <van-row class="list-item" v-for="(item, index) in 9" :key="index">
          <van-col span="8">
            第一课
          </van-col>
          <van-col span="8">已完成</van-col>
          <van-col span="8"
            >5元券
            <van-button
              class="btn"
              :color="colorObj[1]"
              type="info"
              round
              size="mini"
              @click="getCode"
              >{{ isGetObj[1] }}</van-button
            >
          </van-col>
        </van-row>
      </div>
    </div>
    <!-- 券码弹窗 -->
    <van-popup
      round
      v-model="showCode"
      closeable
      v-if="showCode"
      :visible.sync="showCode"
    >
      <div class="ticket">
        <div class="title" id="codeNum">券码:{{ code }}</div>
        <textarea id="input">123</textarea>
        <div
          @click="copy"
          class="btn"
          id="codeBtn"
          :style="{ 'background-color': color }"
          data-clipboard-target="#input"
        >
          {{ txt }}
        </div>
        <div class="tips">温馨提示: 进入小程序输入券码使用</div>
      </div>
    </van-popup>
  </div>
</template>

<script src="@/js/clipboard.min.js"></script>
<script>
import Clipboard from 'clipboard'
export default {
  watch: {
    //对弹窗进行初始化
    showCode () {
      this.txt = '复制'
      this.color = '#269dfc'
    }
  },
  data () {
    return {
      showCode: false,
      code: '341fsadfhjkhsj',
      txt: '复制',
      color: '#269dfc',
      colorObj: { 0: '#aedcff', 1: '#269dfc' },
      isGetObj: { 0: '已领取', 1: '未领取', 2: '未完成' }
    }
  },
  created() {
    window.console.log(123);
  },
  methods: {
    getCode () {
      this.showCode = true
    },
    copy () {
      var clipboard = new Clipboard('.btn')
      let t = document.getElementById('input')
      t.value = this.code
      clipboard.on('success', e => {
        console.log('复制成功', e)
        this.$toast.success({
          message: '复制成功'
        })
        this.txt = '已复制'
        this.color = '#707171'
        // 释放内存
        clipboard.destroy()
      })
      clipboard.on('error', e => {
        // 不支持复制
        this.$toast.fail({
          message: '手机权限不支持复制功能'
        })
        console.log('该浏览器不支持自动复制')
        // 释放内存
        clipboard.destroy()
      })
    }
  }
}
</script>



<style lang="less" scoped>
.myTicket {
  textarea {
    opacity: 0;
    z-index: -1;
    width: 0;
    height: 0;
  }
  height: 667px;
  background-image: url('../assets/我的券.png');
  background-size: contain;
  overflow: hidden;
  .content {
    width: 340px;
    height: 416px;
    margin: 222px auto;
    border-radius: 12px;
    background-color: #fff;
    padding: 30px 0;
    overflow-y: auto;
    .title {
      display: flex;
      justify-content: center;
      font-weight: 700;
      font-size: 16px;
      color: #3d3d3d;
      text-align: center;
      margin-bottom: 32px;
      span {
        flex: 1;
      }
    }
    .list {
      text-align: center;
      font-size: 14px;
      color: #6a6a6a;
      .btn {
        margin-top: 4px;
        padding: 0px 13px;
        font-size: 12px;
      }
      .list-item {
        margin-top: 20px;
      }
    }
  }
  .ticket {
    height: 180px;
    width: 340px;
    background-color: #fff;
    text-align: center;
    .title {
      font-size: 20px;
      color: #696969;
      margin-top: 40px;
    }
    .btn {
      width: 100px;
      height: 40px;
      line-height: 40px;
      margin: auto;
      font-size: 20px;
      color: #fff;
      border-radius: 5px;
    }
    .tips {
      font-size: 11px;
      color: #696969;
      margin-top: 31px;
    }
  }
}
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值