Vue 自定义指令实现一键 Copy功能


Posted in Javascript onSeptember 16, 2019

先看下效果图:

Vue 自定义指令实现一键 Copy功能

指令是啥?

按照惯例,先请出官方的解释:

指令 (Directives) 是带有 v- 前缀的特殊特性。指令特性的值预期是单个 JavaScript 表达式 (v-for 是例外情况,稍后我们再讨论)。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。

再按照惯例,大家 ( 假装 ) 看不懂,然后我来举个栗子解释一番。。。好,还是不知所云,本文结束 ( Ctrl + F4 ) ,下一篇。

为了避免上述情况出现,就不解释了。实际上官方提供了很多内置指令,如: v-if 、 v-for 、 v-bind and so on。每一个指令都有自己特定的功能。

自定义指令

顾名思义就是自己定义的指令啦,可以实现我们想要的功能。下面就实现一个 一键 Copy 的功能吧。

生命周期

首先简单瞟一下指令的语法,每个指令都有自己的生命周期,看到生命周期,肯定会想到钩子函数,没错,指令也提供了钩子函数:

  • bind:指令第一次绑定到元素时调用,此钩子只会调用一次。在这里可以进行一次性的初始化设置。
  • inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
  • update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。
  • componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
  • unbind:只调用一次,指令与元素解绑时调用。

下面再简单瞟一眼上述钩子函数的参数哈:

  • el :指令所绑定的元素,可以用来直接操作 DOM 。
  • binding :一个对象,包含以下属性:
  • name :指令名,不包括 v- 前缀。
  • value :指令的绑定值,例如: v-my-directive="1 + 1" 中,绑定值为 2 。
  • oldValue :指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
  • expression :字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 " 1 + 1 "。
  • arg :传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 " foo "。
  • modifiers :一个包含修饰符的对象。例如: v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true } 。
  • vnode : Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
  • oldVnode :上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

看起来还挺多的,不过别方,其实常用的就几个。好了下面要开始表演了:

首先建一个 js 文件(v-copy.js)。定义一个对象。( 指令实际就是一个对象 )

import { Message } from 'ant-design-vue';

const vCopy = { // 名字爱取啥取啥
 /*
  bind 钩子函数,第一次绑定时调用,可以在这里做初始化设置
  el: 作用的 dom 对象
  value: 传给指令的值,也就是我们要 copy 的值
 */
 bind(el, { value }) {
  el.$value = value; // 用一个全局属性来存传进来的值,因为这个值在别的钩子函数里还会用到
  el.handler = () => {
   if (!el.$value) {
   // 值为空的时候,给出提示,我这里的提示是用的 ant-design-vue 的提示,你们随意
    Message.warning('无复制内容');
    return;
   }
   // 动态创建 textarea 标签
   const textarea = document.createElement('textarea');
   // 将该 textarea 设为 readonly 防止 iOS 下自动唤起键盘,同时将 textarea 移出可视区域
   textarea.readOnly = 'readonly';
   textarea.style.position = 'absolute';
   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) {
    Message.success('复制成功');
   }
   document.body.removeChild(textarea);
  };
  // 绑定点击事件,就是所谓的一键 copy 啦
  el.addEventListener('click', el.handler);
 },
 // 当传进来的值更新的时候触发
 componentUpdated(el, { value }) {
  el.$value = value;
 },
 // 指令与元素解绑的时候,移除事件绑定
 unbind(el) {
  el.removeEventListener('click', el.handler);
 },
};
export default vCopy;

到这里,一键 Copy 的功能就实现了,最后再说一嘴怎么将自定义指令注册到全局:再新建一个 js ( directives.js )文件来注册所有的全局指令。

import copy from './v-copy';
// 自定义指令
const directives = {
 copy,
};
// 这种写法可以批量注册指令
export default {
 install(Vue) {
  Object.keys(directives).forEach((key) => {
   Vue.directive(key, directives[key]);
  });
 },
};

最后,在 main.js 中这样引入:

import Vue from 'vue';
import Directives from './directives';

Vue.use(Directives);

最后的最后,说一下怎么用吧。。

<template>
 <button v-copy="copyText">copy</button>
</template>

<script>
export default {
 data() {
  return {
   copyText: '要 Copy 的内容',
  };
 },
};
</script>

总结

以上所述是小编给大家介绍的Vue 自定义指令实现一键 Copy功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
May 08 Javascript
js去除空格的12种实用方法
Nov 08 Javascript
JS判断表单输入是否为空(示例代码)
Dec 23 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
Apr 27 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
Aug 10 Javascript
学习JavaScript设计模式之责任链模式
Jan 18 Javascript
浅谈js内置对象Math的属性和方法(推荐)
Sep 19 Javascript
jQuery Ajax前后端使用JSON进行交互示例
Mar 17 Javascript
JavaScript模板引擎原理与用法详解
Dec 24 Javascript
详解vue-cli 2.0配置文件(小结)
Jan 14 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
Mar 06 Javascript
Vue实现手机扫描二维码预览页面效果
May 28 Javascript
JavaScript中0、空字符串、'0'是true还是false的知识点分享
Sep 16 #Javascript
layui使用templet格式化表格数据的方法
Sep 16 #Javascript
layui监听单元格编辑前后交互的例子
Sep 16 #Javascript
基于Vue.js与WordPress Rest API构建单页应用详解
Sep 16 #Javascript
Layui弹出层 加载 做编辑页面的方法
Sep 16 #Javascript
解决layer弹出层自适应页面大小的问题
Sep 16 #Javascript
手把手15分钟搭一个企业级脚手架
Sep 16 #Javascript
You might like
php curl 伪造IP来源的实例代码
2012/11/01 PHP
解析php中static,const与define的使用区别
2013/06/18 PHP
PHP中new static()与new self()的区别异同分析
2014/08/22 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
学习YUI.Ext 第三天
2007/03/10 Javascript
符合标准的js表单提交的代码
2007/09/13 Javascript
用JavaScript调用WebService的示例
2008/04/07 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
vue-cli之router基本使用方法详解
2017/10/17 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
JavaScript设计模式之门面模式原理与实现方法分析
2020/03/09 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
2020/10/15 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
Python THREADING模块中的JOIN()方法深入理解
2015/02/18 Python
python 重定向获取真实url的方法
2018/05/11 Python
python读写配置文件操作示例
2019/07/03 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
HTML5+CSS3绘制锯齿状的矩形
2016/03/01 HTML / CSS
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
经典优秀个人求职自荐信格式
2013/09/25 职场文书
物流司机岗位职责
2013/12/28 职场文书
养殖行业的创业计划书
2014/01/05 职场文书
小学生国庆节演讲稿
2014/09/05 职场文书
住房抵押登记委托书
2014/09/27 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
教师节随笔
2015/08/15 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书
创业计划书之废品回收
2019/09/26 职场文书
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers