当前位置: 首页 > news >正文

vue3自定义指令来实现 v-copy 功能

v-copy

在 Vue 3 中,可以通过自定义指令来实现 v-copy 功能

  • 定义指令 - 新建copy.ts文件
//安装
pnpm i lement-plus -Dimport type { Directive, DirectiveBinding, App } from 'vue'
import { ElMessage } from 'element-plus' // 引入element-plus 插件
import { EventType } from '../types' //导入事件的类型// 添加事件监听器函数
function addEventListener(el: Element, binding: DirectiveBinding) {const { value, arg, modifiers } = binding // 解构出绑定值、参数和修饰符console.log(value, modifiers, arg, 'ssss'); // 打印调试信息// 确定事件类型和提示消息const eventType: EventType = modifiers.dblclick ? 'dblclick' : 'click' // 根据修饰符确定事件类型const message = arg || '复制成功' as string // 使用指令参数作为提示消息,默认为"复制成功"el.setAttribute('copyValue', String(value)) // 将绑定值存储为元素属性// 复制操作的处理函数const copyHandler = async (): Promise<void> => {try {if (navigator.clipboard) {// 使用现代浏览器的剪贴板 APIawait navigator.clipboard.writeText(el.getAttribute('copyValue') || '')} else {// 使用兼容旧浏览器的方法legacyCopy(el.getAttribute('copyValue') || '')}// 如果没有启用静默模式,显示成功提示if (!modifiers.quiet) {ElMessage({message: message,type: 'success',})}} catch (err) {// 复制失败时显示错误提示ElMessage.error('复制失败!')}}// 为元素添加事件监听器el.addEventListener(eventType, copyHandler)
}// 兼容旧浏览器的复制方法
function legacyCopy(textToCopy: string) {// 创建一个隐藏的 textarea 元素const textarea = document.createElement('textarea')textarea.value = textToCopy // 设置要复制的文本textarea.style.position = 'fixed' // 使其不可见document.body.appendChild(textarea) // 添加到文档中textarea.select() // 选中其内容// 使用 execCommand 执行复制操作if (!document.execCommand('copy')) {throw new Error('execCommand 执行失败') // 复制失败时抛出错误}document.body.removeChild(textarea) // 移除临时创建的 textarea
}// 自定义指令定义
const vCopy: Directive = {// 元素挂载时执行mounted(el: HTMLElement, binding: DirectiveBinding) {addEventListener(el, binding) // 添加事件监听器},// 元素更新时执行updated(el: HTMLElement, binding: DirectiveBinding) {const { value } = bindingel.setAttribute('copyValue', String(value)) // 更新存储的文本值},
}// 注册指令的函数
export const setupCopyDirective = (app: App<Element>) => {app.directive('copy', vCopy) // 注册自定义指令
}
export default vCopy // 默认导出指令
  • 事件类型导出types.ts
export type EventType = 'click' | 'dblclick'
  • 在组件中,使用 v-copy 指令绑定需要复制的文本 directive.vue
<script setup lang="ts">import {ref} from "vue";import { BaseButton } from '@/components/Button'import { ElInput } from 'element-plus'const value = ref<string>('我是要复制的值')const change = ref<string>('我是要改变的值')
</script><template><button v-copy.dblclick="value">点击我复制</button><BaseButton type="primary" class="w-[20%]" v-copy:复制成功了.dblclick="value">点击我复制</BaseButton><el-input v-model="change" placeholder="Please input" /><BaseButton type="primary" class="w-[20%]" @click="() => value = change">改变将要复制的值</BaseButton></template>

相关文章:

  • 【Python正则表达式终极指南】从零到工程级实战
  • 3D打印仿造+ AI大脑赋能,造出会思考的全景相机
  • ITK-读取DICOM序列标签
  • JVM 性能优化终极指南:全版本兼容、参数公式与场景实战
  • 从零开始的抽奖系统创作(4)
  • Java面向对象编程核心:封装、继承与多态
  • PyQt学习系列10-性能优化与调试技巧
  • Ubuntu 25.04 锁屏不能远程连接的解决方案
  • 互联网大厂Java求职面试:Spring Boot 3.2+自动配置原理、AOT编译及原生镜像
  • vue3前端开发过程中,解决跨域
  • 树莓派内核源码的下载,配置,编译和替换
  • Flutter跨平台通信实战|3步打通Android原生能力,实现底层API调用!
  • 【PhysUnits】9 取负重载(negation.rs)
  • 2025年河北省职业院校技能大赛“网络空间安全技能大赛”赛项样题A
  • Fastrace:Rust 中分布式追踪的现代化方案
  • 使用 kafka-console-consumer.sh 指定时间或偏移量消费
  • 题目 3330: 蓝桥杯2025年第十六届省赛真题-01 串
  • Joplin+群晖NAS远程同步方案:私有云笔记的稳定存储与跨设备管理实践
  • Kafka Producer 如何实现Exactly Once消息传递语义
  • 一文详解生成式 AI:李宏毅《生成式 AI 导论》学习笔记
  • 海阔天空网站建设/如何制作网页广告
  • 分享网络营销方式/seo专业培训技术
  • 网站哪家做的好/外链生成器
  • 网站建站如何做seo/关键字查找
  • 郑州市做网站的/北京最新疫情
  • 旅游网站开发系统的er图/市场监督管理局职责