v-copy 自定义一键复制指令

在实际开发中看到前辈写的代码有一个v-copy的自定义指令,点击赋值所绑定的值 觉得好用以后也会用得上就保存子自己的csdn中了

创建相关js----clipboard.js

import { Message } from 'element-ui'
/*
  bind 钩子函数,第一次绑定时调用,可以在这里做初始化设置
  el: 作用的 dom 对象
  value: 传给指令的值,也就是我们要 copy 的值
 */
const clipboard = {
  bind(el, { value }) {
    el.$value = value // 用一个全局属性来存传进来的值,因为这个值在别的钩子函数里还会用到
    el.handler = () => {
      if (!el.$value) {
        // 值为空的时候,给出提示
        console.log('无复制内容')
        return
      }
      // 动态创建 textarea 标签
      const textarea = document.createElement('textarea')
      // 将该 textarea 设为 readonly 防止 iOS 下自动唤起键盘,同时将 textarea 移出可视区域
      textarea.readOnly = 'readonly'
      textarea.style.position = 'absolute'
      textarea.style.left = '-9999px'
      // 将要 copy 的值赋给 textarea 标签的 value 属性
      textarea.value = el.$value
      // 将 textarea 插入到 body 中
      document.body.appendChild(textarea)
      // 选中值并复制
      textarea.select()
      textarea.setSelectionRange(0, textarea.value.length)
      const result = document.execCommand('Copy') // document.execCommand()在某些浏览器下不支持异步操作
      if (result) {
        console.log('复制成功')
        Message.success('复制成功')
      }
      document.body.removeChild(textarea)
    }
    // 绑定点击事件,就是所谓的一键 copy 啦
    el.addEventListener('click', el.handler)
  },
  // 当传进来的值更新的时候触发
  componentUpdated(el, { value }) {
    el.$value = value
  },
  // 指令与元素解绑的时候,移除事件绑定
  unbind(el) {
    el.removeEventListener('click', el.handler)
  }
}
export default clipboard

注册  导入到index.js中  

import clipboard from './common/clipboard.js'

// 自定义指令 v-copy
const directives = {
  copy: clipboard
}
// 这种写法可以批量注册指令
export default {
  install(Vue) {
    Object.keys(directives).forEach(key => {
      Vue.directive(key, directives[key])
    })
  }
}

需要在main.js中引用

import clipboard from './自定义文件名'



Vue.use(clipboard)

实际使用

 <div class="item" v-for="(it, i) in rechargeInfo" :key="i">
            <span>{{ it.name || '--' }}{{ it.value }}</span>
            <p v-copy="it.value">复制</p>
          </div>

这样就能获得一键复制以及一个复制成功的提示了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值