最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

1、創(chuàng)建一個文件,比如: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ù)字則賦值默認值 1000ms
      if (timer && parseInt(timer) != timer) {
        el.$timer = parseInt(timer)
      } else {
        el.$timer = 1000
      }
      el.$value = binding.value

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

        if (!el.$value) {
          // 值為空的時候,給出提示
          notification.warning({ message: '系統(tǒng)提示', description: '無復制內(nèi)容' })
          return
        }
        // 獲取是否支持復制api
        if (el.$isSupported === undefined) {
          el.$isSupported = navigator && 'clipboard' in navigator
        }
        // 判斷瀏覽器是否支持 navigator.clipboard
        if (!el.$isSupported) {
          // 不支持,使用舊的復制方式
          // 動態(tài)創(chuàng)建 textarea 標簽
          const textarea = document.createElement('textarea')
          // 將該 textarea 設(shè)為 readonly 防止 iOS 下自動喚起鍵盤,同時將 textarea 移出可視區(qū)域
          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: '系統(tǒng)提示', description: '復制成功' })
          }
          document.body.removeChild(textarea)
        } else {
          // 使用 clipboard API
          await navigator!.clipboard.writeText(el.$value)
          notification.success({ message: '系統(tǒng)提示', 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' // 上面創(chuàng)建的文件
const app = createApp(App)

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

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

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>

總結(jié)

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

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

相關(guān)文章

  • vue中的事件修飾符介紹和示例

    vue中的事件修飾符介紹和示例

    在Vue中,修飾符處理了許多DOM事件的細節(jié),讓我們不再需要花大量的時間去處理這些煩惱的事情,而能有更多的精力專注于程序的邏輯處理,需要的朋友可以參考下
    2023-04-04
  • vue子組件中mounted取不到props中的值情況

    vue子組件中mounted取不到props中的值情況

    這篇文章主要介紹了vue子組件中mounted取不到props中的值情況,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue3不支持Filters過濾器的問題

    Vue3不支持Filters過濾器的問題

    這篇文章主要介紹了Vue3不支持Filters過濾器的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 前端Uniapp使用Vant打造Uniapp項目避坑指南

    前端Uniapp使用Vant打造Uniapp項目避坑指南

    這篇文章主要給大家介紹了關(guān)于前端Uniapp使用Vant打造Uniapp項目避坑的相關(guān)資料,Uniapp結(jié)合Vant可以快速構(gòu)建跨平臺移動應(yīng)用,通過HBuilderX安裝和配置Vant組件,解決了樣式識別問題,并實現(xiàn)了組件的全局注冊,需要的朋友可以參考下
    2024-11-11
  • vue2?web多標簽輸入框elinput是否當前焦點詳解

    vue2?web多標簽輸入框elinput是否當前焦點詳解

    這篇文章主要介紹了vue2?web多標簽輸入框elinput是否當前焦點的相關(guān)資料,講解了如何在產(chǎn)品中實現(xiàn)用戶輸入文字后按下回車鍵生成標簽并顯示在頁面上的功能,通過組件的使用和改造,解決了輸入不連續(xù)的問題,需要的朋友可以參考下
    2025-01-01
  • vue2創(chuàng)建高復用組件的方法示例

    vue2創(chuàng)建高復用組件的方法示例

    Vue2中的高復用組件通常是指那些設(shè)計得足夠通用,并能多次在項目中重復使用的組件,本文給大家詳細介紹了vue2創(chuàng)建高復用組件的方法示例,并通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-07-07
  • 淺析為什么Vue使用虛擬DOM

    淺析為什么Vue使用虛擬DOM

    Vue?使用虛擬?DOM?的初衷不僅是為了性能優(yōu)化,更重要的是為了解決開發(fā)效率和靈活性的問題,下面我們就來探討一下虛擬DOM的作用與原理吧
    2024-12-12
  • Vue使用babel-polyfill兼容IE解決白屏及語法報錯問題

    Vue使用babel-polyfill兼容IE解決白屏及語法報錯問題

    這篇文章主要介紹了Vue使用babel-polyfill兼容IE解決白屏及語法報錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Vue解決跨域問題常見方法詳解

    Vue解決跨域問題常見方法詳解

    這篇文章主要介紹了Vue解決跨域問題常見方法,結(jié)合實例形式詳細分析了vue出現(xiàn)跨域問題的原因,以及常見解決方案與相關(guān)注意事項,需要的朋友可以參考下
    2023-06-06
  • Nuxt3:拉取項目模板失敗問題以及解決

    Nuxt3:拉取項目模板失敗問題以及解決

    文章描述了在使用官網(wǎng)命令創(chuàng)建Nuxt3項目時遇到的問題,通過分析命令,推測問題出在拉取項目模板失敗,解決方法是手動訪問并下載項目模板,解壓后按照官網(wǎng)教程安裝依賴并啟動,最終成功解決問題
    2024-12-12

最新評論

云梦县| 满城县| 虎林市| 松原市| 池州市| 手游| 紫金县| 时尚| 咸阳市| 梁平县| 万年县| 康保县| 廉江市| 喀什市| 乌兰浩特市| 抚松县| 金川县| 顺义区| 亳州市| 冕宁县| 正阳县| 小金县| 恩平市| 枣庄市| 邵阳市| 都兰县| 中西区| 长乐市| 梧州市| 黔江区| 莱州市| 庆阳市| 十堰市| 喀什市| 鸡东县| 江安县| 高邮市| 德阳市| 沙坪坝区| 连平县| 泰和县|