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

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中的事件修飾符介紹和示例

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

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

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

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

    Vue3不支持Filters過濾器的問題

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

    前端Uniapp使用Vant打造Uniapp項(xiàng)目避坑指南

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

    vue2?web多標(biāo)簽輸入框elinput是否當(dāng)前焦點(diǎn)詳解

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

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

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

    淺析為什么Vue使用虛擬DOM

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

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

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

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

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

    Nuxt3:拉取項(xiàng)目模板失敗問題以及解決

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

最新評論

黄陵县| 聂拉木县| 泸西县| 巴彦县| 延寿县| 纳雍县| 布拖县| 平和县| 土默特右旗| 田东县| 玉林市| 乐都县| 洞头县| 舞钢市| 万载县| 彭山县| 香格里拉县| 军事| 铅山县| 郁南县| 图片| 清水县| 济阳县| 定南县| 灵武市| 呼伦贝尔市| 东阳市| 吉木乃县| 张北县| 洛扎县| 鄂伦春自治旗| 江油市| 禹城市| 长丰县| 会昌县| 白水县| 铜梁县| 东莞市| 喀喇| 梓潼县| 洮南市|