实现复制功能

前言

复制是最常见的功能,当产品经理要我们实现这一功能,告诉他直接用ctrl+v肯定会被'翻白眼',这时候肯定要大声说复制功能小菜一碟。本节我们就来看一下如何实现复制功能。

实现

说起复制,首先想到的就是ctrl+c,ctrl+c能把选中的内容放到Clipboard(剪贴板)中,复制功能说白了就是把内容放到剪贴板中,要实现复制离不开剪贴板,那么我们先来了解Clipboard。

Clipboard

Clipboard是一个临时存储区域,能够让用户进行复制、粘贴等操作,而这些操作可以由Clipboard控制,Navigator.clipboard就表示系统剪贴板,对应这有以下相关方法:

  • read():读取剪贴板的数据,包括图片等。
  • write():将数据写入剪贴板。
  • readText():读取剪贴板文本数据。
  • writeText():将文本写入剪贴板。

其中write与wtirteText可以帮我们实现复制功能,根据具体需求选择合适的方法即可。下面我们就写一个复制功能的实例。

实例

本次我们用vue2技术栈去实现,其他技术栈也是用write/writeText方法。画一个输入框与复制按钮,点击复制按钮就能把输入框里面的内容复制出来。

点击复制按钮就会提示复制成功,此时我们ctrl+v就会发现粘贴的内容就是刚才输入框输入的内容。如果我们想要复制图像等就把writeText变成write。

复制功能的实现就是如此简单,如果多个页面都需要用到复制功能我们可以封装一个组件,把按钮变成复制图标。 哪个页面需要就注册使用:

js 复制代码
   <CopyText :text="123"/>

自定义指令

上面例子中我们封装了一个组件,除此之外我们还可以封装一个自定义指令,实现复制功能。vue2中自定义指令为directive,directive是由一个包含钩子函数的对象构成,对应的钩子函数有bind,inserted等,每个钩子函数接收以下参数:

  • el:dom元素。
  • binding:包含着传给指令的值,修饰符等内容的对象。
  • vnode:虚拟Dom元素。
  • oldVnode:之前的虚拟Dom元素,只能在componentUpdated、updated使用。
    一般我们用el、binding两个参数就可以啦,指令定义完成之后,用vue.directive(id,fun)方法去注册。根据以上内容我们写一个v-copy的指令,如果指令中传值了我们就复制传递过来的值,如果没有我们直接复制el元素的text,这样就有两种用法了。
js 复制代码
   import { DirectiveOptions } from 'vue'
export const copy: DirectiveOptions = {
  inserted(el, binding) {
    const { value } = binding
    //双击触发
    el.addEventListener('dblclick', () => {
      if (value) {
        navigator.clipboard.writeText(value)
      } else {
        navigator.clipboard.writeText(el.innerText)
      }
    })
    el.style.cursor = 'copy'
  }
}

新建一个directives文件夹,再建copy.ts文件,写入上述代码,然后再main.ts中引入注册。

js 复制代码
   import * as directives from '@/directives'
   //全局注册
   Object.keys(directives).forEach(key => {
  Vue.directive(key, (directives as { [key: string]: DirectiveOptions })[key])
})

这时候我们在页面上就可以使用v-copy指令,如果v-copy后面有值就会复制参数值,如果没有就复制自身文本。

js 复制代码
    <div v-copy>123</div>
    <div v-copy="456">复制</div>

在页面上双击第一个div就会复制123,双击第二个div就会复制456。

vue-clipboard2

Vue-clipboard2是可以完成复制功能的插件,用法非常简单,并且功能要比我们自己写的丰富。我们将该插件下载,然后再main.ts中引入使用。

js 复制代码
   import VueClipBoard from 'vue-clipboard2'
   Vue.use(VueClipBoard)

复制方法就绑定到了实例中,这时候我们直接用this.$copyText方法就能复制内容。

js 复制代码
     private handleCopy() {
    this.$copyText(`${this.text}`)
    this.$message.success('复制成功')
  }

就是如此的简单方便。

总结

以上就是在vue中实现复制功能的方法,如果想要简单一点的就直接用vue-clipboard2插件;如果只是一两处复制我们就直接用Navigator.clipboard实现。

相关推荐
腾讯TNTWeb前端团队6 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰9 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪9 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪10 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy10 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom11 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom11 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom11 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom11 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom11 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试