vue自定义指令实现一键复制功能

 更新时间:2024年11月30日 15:41:10   作者:你我皆牛马MC  
本文旨在记录解决在工作中一键复制功能得需求,本文主要使用了Vue3+TypeScript+Ant-Design-Vue,感兴趣的小伙伴可以跟随小编一起学习一下

什么是vue自定义指令?请移步Vue自定义指令

实现的指令兼容了不支持navigator.clipboard API的浏览器,且实现了节流的效果,默认间隔时间1000ms

1、创建一个文件,比如:copy.ts

import { notification } from 'ant-design-vue'

// 自定义一些属性
interface IListenter {
  (event: MouseEvent): void
}

interface ICopyElement extends HTMLElement {
  $value: string
  $isSupported: boolean
  $isClick: boolean
  $timer: number
  $handleCopy: IListenter
}

const useCopy = (app: ReturnType<typeof createApp>) => {
  app.directive('copy', {
    mounted(el: ICopyElement, binding: ReturnType<typeof Object>) {
      console.log(binding)
      let timer = binding.arg?.split(':')[0] || ''
      // 判断timer是否存在,且是否为数字,如果不是数字则赋值默认值 1000ms
      if (timer && parseInt(timer) != timer) {
        el.$timer = parseInt(timer)
      } else {
        el.$timer = 1000
      }
      el.$value = binding.value

      el.$handleCopy = async (event: MouseEvent) => {
        // 简单做个节流
        if (el.$isClick) return
        el.$isClick = true
        let t = setTimeout(() => {
          clearTimeout(t)
          el.$isClick = false
        }, el.$timer)

        if (!el.$value) {
          // 值为空的时候,给出提示
          notification.warning({ message: '系统提示', description: '无复制内容' })
          return
        }
        // 获取是否支持复制api
        if (el.$isSupported === undefined) {
          el.$isSupported = navigator && 'clipboard' in navigator
        }
        // 判断浏览器是否支持 navigator.clipboard
        if (!el.$isSupported) {
          // 不支持,使用旧的复制方式
          // 动态创建 textarea 标签
          const textarea = document.createElement('textarea')
          // 将该 textarea 设为 readonly 防止 iOS 下自动唤起键盘,同时将 textarea 移出可视区域
          textarea.readOnly = true
          textarea.style.position = 'fixed'
          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')
          if (result) {
            notification.success({ message: '系统提示', description: '复制成功' })
          }
          document.body.removeChild(textarea)
        } else {
          // 使用 clipboard API
          await navigator!.clipboard.writeText(el.$value)
          notification.success({ message: '系统提示', description: '复制成功' })
        }
      }
      el.addEventListener('click', el.$handleCopy, false)
    },
    unmounted(el: ICopyElement) {
      el.removeEventListener('click', el.$handleCopy)
    }
  })
}

export default (app: ReturnType<typeof createApp>) => {
  useCopy(app)
}

2、在main.ts文件中使用

import App from './App.vue'
import * as copyFn from './copy' // 上面创建的文件
const app = createApp(App)

if (typeof copyFn.default === 'function') {
    copyFn.default(app)
}
app.mount('#app')

上面的写法可以根据自己项目中的情况改变

3、使用

// test.vue
<template>
    <!-- 使用默认的间隔时间 -->
    <a-button v-copy="value">一键复制</a-button>
    
    <!-- 自定义间隔时间 -->
    <!-- <a-button v-copy:2000="value">一键复制</a-button> -->
</template>

<script lang="ts" setup>
import {ref} from 'vue'

const value = ref('这是一个自定义一键复制的指令')

</script>

总结

总的来说这个自定义指令比较简单,实现这个指令是为了项目中多处地方方便使用,此文章不过多的解释其中的代码,有需要的可以直接复制到自己代码中测试一下。

以上就是vue自定义指令实现一键复制功能的详细内容,更多关于vue一键复制的资料请关注脚本之家其它相关文章!

相关文章

  • 详解vue服务端渲染浏览器端缓存(keep-alive)

    详解vue服务端渲染浏览器端缓存(keep-alive)

    在使用服务器端渲染时,除了服务端的接口缓存、页面缓存、组建缓存等,浏览器端也避免不了要使用缓存,减少页面的重绘。这篇文章主要介绍了详解vue服务端渲染浏览器端缓存(keep-alive),感兴趣的小伙伴们可以参考一下
    2018-10-10
  • 详解vue配置请求多个服务端解决方案

    详解vue配置请求多个服务端解决方案

    这篇文章主要介绍了详解vue配置请求多个服务端解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • vue项目中更改名字和图标的简单实现步骤

    vue项目中更改名字和图标的简单实现步骤

    今天在写vue项目时碰到的问题是怎么修改vue的网页图标,所以下面这篇文章主要给大家介绍了关于vue项目中更改名字和图标的简单实现,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • vue component组件使用方法详解

    vue component组件使用方法详解

    这篇文章主要为大家详细介绍了vue component组件的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • vue如何判断dom的class

    vue如何判断dom的class

    这篇文章主要介绍了vue如何判断dom的class,vue点击给dom添加class然后获取含有class的dom文件,具体内容详情大家参考下本文
    2018-04-04
  • 解决Vue2.0 watch对象属性变化监听不到的问题

    解决Vue2.0 watch对象属性变化监听不到的问题

    今天小编就为大家分享一篇解决Vue2.0 watch对象属性变化监听不到的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue中轻量级模糊查询fuse.js使用方法步骤

    vue中轻量级模糊查询fuse.js使用方法步骤

    这篇文章主要给大家介绍了关于vue中轻量级模糊查询fuse.js使用方法的相关资料,Fuse.js是一个功能强大、轻量级的模糊搜索库,通过提供简单的 api 调用,达到强大的模糊搜索效果,需要的朋友可以参考下
    2024-01-01
  • Vue3利用组合式函数和Shared Worker实现后台分片上传

    Vue3利用组合式函数和Shared Worker实现后台分片上传

    这篇文章主要为大家详细介绍了Vue3如何利用组合式函数和Shared Worker实现后台分片上传(带哈希计算),感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • vue.js移动数组位置,同时更新视图的方法

    vue.js移动数组位置,同时更新视图的方法

    下面小编就为大家分享一篇vue.js移动数组位置,同时更新视图的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • Vue项目查看当前使用的elementUI版本的方法

    Vue项目查看当前使用的elementUI版本的方法

    今天小编就为大家分享一篇Vue项目查看当前使用的elementUI版本的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09

最新评论