亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue自定義指令實(shí)現(xiàn)一鍵復(fù)制功能

 更新時(shí)間:2024年11月30日 15:41:10   作者:你我皆牛馬MC  
本文旨在記錄解決在工作中一鍵復(fù)制功能得需求,本文主要使用了Vue3+TypeScript+Ant-Design-Vue,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

什么是vue自定義指令?請移步Vue自定義指令

實(shí)現(xiàn)的指令兼容了不支持navigator.clipboard API的瀏覽器,且實(shí)現(xiàn)了節(jié)流的效果,默認(rèn)間隔時(shí)間1000ms

1、創(chuàng)建一個(gè)文件,比如: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是否存在,且是否為數(shù)字,如果不是數(shù)字則賦值默認(rèn)值 1000ms
      if (timer && parseInt(timer) != timer) {
        el.$timer = parseInt(timer)
      } else {
        el.$timer = 1000
      }
      el.$value = binding.value

      el.$handleCopy = async (event: MouseEvent) => {
        // 簡單做個(gè)節(jié)流
        if (el.$isClick) return
        el.$isClick = true
        let t = setTimeout(() => {
          clearTimeout(t)
          el.$isClick = false
        }, el.$timer)

        if (!el.$value) {
          // 值為空的時(shí)候,給出提示
          notification.warning({ message: '系統(tǒng)提示', description: '無復(fù)制內(nèi)容' })
          return
        }
        // 獲取是否支持復(fù)制api
        if (el.$isSupported === undefined) {
          el.$isSupported = navigator && 'clipboard' in navigator
        }
        // 判斷瀏覽器是否支持 navigator.clipboard
        if (!el.$isSupported) {
          // 不支持,使用舊的復(fù)制方式
          // 動態(tài)創(chuàng)建 textarea 標(biāo)簽
          const textarea = document.createElement('textarea')
          // 將該 textarea 設(shè)為 readonly 防止 iOS 下自動喚起鍵盤,同時(shí)將 textarea 移出可視區(qū)域
          textarea.readOnly = true
          textarea.style.position = 'fixed'
          textarea.style.left = '-9999px'
          // 將要 copy 的值賦給 textarea 標(biāo)簽的 value 屬性
          textarea.value = el.$value
          // 將 textarea 插入到 body 中
          document.body.appendChild(textarea)
          // 選中值并復(fù)制
          textarea.select()
          // textarea.setSelectionRange(0, textarea.value.length);
          const result = document.execCommand('Copy')
          if (result) {
            notification.success({ message: '系統(tǒng)提示', description: '復(fù)制成功' })
          }
          document.body.removeChild(textarea)
        } else {
          // 使用 clipboard API
          await navigator!.clipboard.writeText(el.$value)
          notification.success({ message: '系統(tǒng)提示', description: '復(fù)制成功' })
        }
      }
      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' // 上面創(chuàng)建的文件
const app = createApp(App)

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

上面的寫法可以根據(jù)自己項(xiàng)目中的情況改變

3、使用

// test.vue
<template>
    <!-- 使用默認(rèn)的間隔時(shí)間 -->
    <a-button v-copy="value">一鍵復(fù)制</a-button>
    
    <!-- 自定義間隔時(shí)間 -->
    <!-- <a-button v-copy:2000="value">一鍵復(fù)制</a-button> -->
</template>

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

const value = ref('這是一個(gè)自定義一鍵復(fù)制的指令')

</script>

總結(jié)

總的來說這個(gè)自定義指令比較簡單,實(shí)現(xiàn)這個(gè)指令是為了項(xiàng)目中多處地方方便使用,此文章不過多的解釋其中的代碼,有需要的可以直接復(fù)制到自己代碼中測試一下。

以上就是vue自定義指令實(shí)現(xiàn)一鍵復(fù)制功能的詳細(xì)內(nèi)容,更多關(guān)于vue一鍵復(fù)制的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解vue服務(wù)端渲染瀏覽器端緩存(keep-alive)

    詳解vue服務(wù)端渲染瀏覽器端緩存(keep-alive)

    在使用服務(wù)器端渲染時(shí),除了服務(wù)端的接口緩存、頁面緩存、組建緩存等,瀏覽器端也避免不了要使用緩存,減少頁面的重繪。這篇文章主要介紹了詳解vue服務(wù)端渲染瀏覽器端緩存(keep-alive),感興趣的小伙伴們可以參考一下
    2018-10-10
  • 詳解vue配置請求多個(gè)服務(wù)端解決方案

    詳解vue配置請求多個(gè)服務(wù)端解決方案

    這篇文章主要介紹了詳解vue配置請求多個(gè)服務(wù)端解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • vue項(xiàng)目中更改名字和圖標(biāo)的簡單實(shí)現(xiàn)步驟

    vue項(xiàng)目中更改名字和圖標(biāo)的簡單實(shí)現(xiàn)步驟

    今天在寫vue項(xiàng)目時(shí)碰到的問題是怎么修改vue的網(wǎng)頁圖標(biāo),所以下面這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目中更改名字和圖標(biāo)的簡單實(shí)現(xiàn),文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • vue component組件使用方法詳解

    vue component組件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了vue component組件的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • vue如何判斷dom的class

    vue如何判斷dom的class

    這篇文章主要介紹了vue如何判斷dom的class,vue點(diǎn)擊給dom添加class然后獲取含有class的dom文件,具體內(nèi)容詳情大家參考下本文
    2018-04-04
  • 解決Vue2.0 watch對象屬性變化監(jiān)聽不到的問題

    解決Vue2.0 watch對象屬性變化監(jiān)聽不到的問題

    今天小編就為大家分享一篇解決Vue2.0 watch對象屬性變化監(jiān)聽不到的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue中輕量級模糊查詢fuse.js使用方法步驟

    vue中輕量級模糊查詢fuse.js使用方法步驟

    這篇文章主要給大家介紹了關(guān)于vue中輕量級模糊查詢fuse.js使用方法的相關(guān)資料,Fuse.js是一個(gè)功能強(qiáng)大、輕量級的模糊搜索庫,通過提供簡單的?api?調(diào)用,達(dá)到強(qiáng)大的模糊搜索效果,需要的朋友可以參考下
    2024-01-01
  • Vue3利用組合式函數(shù)和Shared Worker實(shí)現(xiàn)后臺分片上傳

    Vue3利用組合式函數(shù)和Shared Worker實(shí)現(xiàn)后臺分片上傳

    這篇文章主要為大家詳細(xì)介紹了Vue3如何利用組合式函數(shù)和Shared Worker實(shí)現(xiàn)后臺分片上傳(帶哈希計(jì)算),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • vue.js移動數(shù)組位置,同時(shí)更新視圖的方法

    vue.js移動數(shù)組位置,同時(shí)更新視圖的方法

    下面小編就為大家分享一篇vue.js移動數(shù)組位置,同時(shí)更新視圖的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • Vue項(xiàng)目查看當(dāng)前使用的elementUI版本的方法

    Vue項(xiàng)目查看當(dāng)前使用的elementUI版本的方法

    今天小編就為大家分享一篇Vue項(xiàng)目查看當(dāng)前使用的elementUI版本的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09

最新評論