Vue自定义复制指令 v-copy功能的实现

使用自定义指令创建一个点击复制文本功能

1. 创建v-copy.js文件

import Vue from "vue";
// 注册一个全局自定义复制指令 `v-copy`
Vue.directive("copy", {
  bind(el, { value }) {
    el.$value = value;
    el.handler = () => {
      el.style.position = 'relative';
      if (!el.$value) {
        // 值为空的时候,给出提示
        alert('无复制内容');
        return
      }
      // 动态创建 textarea 标签
      const textarea = document.createElement('textarea');
      // 将该 textarea 设为 readonly 防止 iOS 下自动唤起键盘,同时将 textarea 移出可视区域
      textarea.readOnly = 'readonly';
      textarea.style.position = 'absolute';
      textarea.style.top = '0px';
      textarea.style.left = '-9999px';
      textarea.style.zIndex = '-9999';
      // 将要 copy 的值赋给 textarea 标签的 value 属性
      textarea.value = el.$value
      // 将 textarea 插入到 el 中
      el.appendChild(textarea);
      // 兼容IOS 没有 select() 方法
      if (textarea.createTextRange) {
        textarea.select(); // 选中值并复制
      } else {
        textarea.setSelectionRange(0, el.$value.length);
        textarea.focus();
      }
      const result = document.execCommand('Copy');
      if (result) alert('复制成功');
      el.removeChild(textarea);
    }
    el.addEventListener('click', el.handler); // 绑定点击事件
  },
  // 当传进来的值更新的时候触发
  componentUpdated(el, { value }) {
    el.$value = value;
  },
  // 指令与元素解绑的时候,移除事件绑定
  unbind(el) {
    el.removeEventListener('click', el.handler);
  },
});

2. 引入v-copy

//  main.js 根据文件的相关路径引入v-copy.js文件
import "xx/v-copy.js"; // v-copy 指令

3. 在标签使用v-copy

<span v-copy="复制内容">复制</span>

补充:Vue 自定义指令合集 (文本内容复制指令 v-copy)

我们常常在引入全局功能时,主要都是写于 js 文件、组件中。不同于他们在使用时每次需要引用或注册,在使用上指令更加简洁。

今天主要实现的是一个复制文本指令*v-copy*,其中主要的参数有两个icondblclick

参数 说明
dblclick 双击复制
icon 添加icon复制按钮,单击按钮实现复制

代码如下:

bind(el, binding) {
    if (binding.modifiers.dblclick) {
        el.addEventListener("dblclick", () => handleClick(el.innerText));
        el.style.cursor = "copy";
    } else if (binding.modifiers.icon) {
        el.addEventListener("mouseover", () => {
            if (el.hasicon) return;
            const icon = document.createElement("em");
            icon.setAttribute("class", "demo");
            icon.setAttribute("style", "{margin-left:5px,color:red}");
            icon.innerText = "复制";
            el.appendChild(icon);
            el.hasicon = true;
            icon.addEventListener("click", () => handleClick(el.innerText));
            icon.style.cursor = "pointer";
        });
        el.addEventListener("mouseleave", () => {
            let em = el.querySelector("em");
            el.hasicon = false;
            el.removeChild(em);
        });
    } else {
        el.addEventListener("click", () => handleClick(el.innerText));
        el.style.cursor = "copy";
    }
    function handleClick(content) {
        if (Window.clipboardData) {
            window.Clipboard.setData("text", content);
            return;
        } else {
            (function(content) {
                document.oncopy = function(e) {
                    e.clipboardData.setData("text", content);
                    e.preventDefault();
                    document.oncopy = null;
                };
            })(content);
            document.execCommand("Copy");
        }
    }
},

到此这篇关于Vue自定义复制指令 v-copy功能的实现的文章就介绍到这了,更多相关Vue复制指令 v-copy内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue中自定义指令directive的详细指南

    目录 一. 什么是自定义指令 二. 如何自定义指令 钩子函数 三.应用场景 输入框防抖 图片懒加载 一键 Copy的功能 拖拽 总结 一. 什么是自定义指令 我们看到的v-开头的行内属性,都是指令,不同的指令可以完成或实现不同的功能,对普通 DOM元素进行底层操作,这时候就会用到自定义指令.除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令 指令使用的几种方式: //会实例化一个指令,但这个指令没有参数 `v-xxx` // -- 将值传到指令中 `v

  • Vue自定义指令详细

    目录 1.背景 2.局部自定义指令 3.全局自定义指令 4.1 自定义指令钩子函数 4.2 钩子函数参数 4.3 动态指令传参 5.拓展 1.背景 最近在面试找工作,然后面试官就问了有关自定义指令的问题,然后由于平时自定义指令用的不多,只是看过官方文档大概知道需要用到Vue.directive来自定义指令:面试结束之后,立刻就去网上找有关自定义指令的资料,发现自定义指令还是有很多学问的,于是就想写个博客记录下也是鞭策自己,要多尝试,多学习!!! 这是官方文档有关自定义指令的模块:自定义指令包括全

  • Vue自定义复制指令 v-copy功能的实现

    使用自定义指令创建一个点击复制文本功能 1. 创建v-copy.js文件 import Vue from "vue"; // 注册一个全局自定义复制指令 `v-copy` Vue.directive("copy", { bind(el, { value }) { el.$value = value; el.handler = () => { el.style.position = 'relative'; if (!el.$value) { // 值为空的时候,

  • vue自定义封装指令以及实际使用

    目录 前言 封装指令基础 钩子函数 钩子函数参数 实际使用 复制指令(v-copy) 单击复制 双击复制 点击icon复制 handleClick 逻辑 完整代码 权限操作指令(v-hasPermi) 总结 前言 vue默认内置了v-model.v-if.v-show.v-html.v-text等指令,但是这些往往不足以满足我们实际项目开发中的场景,比如权限控制按钮.路由菜单,复制文字等功能,就需要我们自己自定义一些满足我们项目需求的指令了,那怎么封装自定义指令,并使用呢?我们先从封装指令的基础

  • vue自定义tap指令及tap事件的实现

    1.Vue指令 Vue提供自定义实现指令的功能, 和组件类似,可以是全局指令和局部指令,详细可以参见vue官网自定义指令一节(https://cn.vuejs.org/v2/guide/custom-directive.html). 2.v-tap指令实现 我个人的理解,编写指令即是在vue指令对象提供的钩子函数中做相应的逻辑处理,tap指令是在bind钩子函数中做相应的处理, 首先,要明白的是tap是为了处理click事件在iphone上的存在300ms的延时,这样使得连续点击很不流畅,tap

  • Vue自定义v-has指令,做按钮权限判断的步骤

    应用场景 以后台管理系统为例,每个用户所拥有的按钮权限不一样.管理员配置权限之后,用户登录时,从接口拿到按钮权限列表,然后根据后台数据判断显示哪些按钮. 简单说一下,自定义指令 Vue.js官网关于自定义指令的讲解 cn.vuejs.org/v2/guide/cu- 基础概念 Vue除了核心功能默认内置的指令(v-model和v-show)还可以注册自定义指令. 在Vue2.0中,代码复用和抽象的主要形式是组件.但有的情况下,仍需要对普通DOM元素进行底层操作,这时候就会用到自定义指令. 譬如,

  • Vue自定义v-has指令实现按钮权限判断

    应用场景 以后台管理系统为例,每个用户所拥有的按钮权限不一样.管理员配置权限之后,用户登录时,从接口拿到按钮权限列表,然后根据后台数据判断显示哪些按钮. 简单说一下,自定义指令 Vue.js官网关于自定义指令的讲解 cn.vuejs.org/v2/guide/cu- 基础概念 Vue除了核心功能默认内置的指令(v-model和v-show)还可以注册自定义指令. 在Vue2.0中,代码复用和抽象的主要形式是组件.但有的情况下,仍需要对普通DOM元素进行底层操作,这时候就会用到自定义指令. 譬如,

  • lottie实现vue自定义loading指令及常用指令封装详解

    目录 一.前言 二.实现方式 1.v-loading 2.v-click-outside 三.后记 一.前言 本文主要介绍使用lottie动画实现vue自定义loading的指令方法.另外本篇文章还会介绍其他几个常用的自定义指令实现方式(点击指定区域外监听指令). lottie是一款由airbnb开源的跨平台动画渲染库,支持Android,iOS,Web,Windows平台.是专门用于解析从AE(Adobe After Effects)中通过Bodymovin插件导出的JSON文件,直接渲染动画

  • Vue自定义弹窗指令的实现代码

    目标 使用vue2.0实现自定义弹窗指令,当标签有该指令时,点击标签可以弹出弹窗 实现 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <met

  • VUE 实现复制内容到剪贴板的两种方法

    VUE 复制内容至剪切板(两种使用方法) 复制内容至剪切板使用的是插件'vue-clipboard2',通过官方文档会发现共有两种使用方式. 第一种方式与大多数文章类似,只粘贴代码: <template> <div class="container"> <input type="text" v-model="message"> <button type="button" v-clipb

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

    先看下效果图: 指令是啥? 按照惯例,先请出官方的解释: 指令 (Directives) 是带有 v- 前缀的特殊特性.指令特性的值预期是单个 JavaScript 表达式 (v-for 是例外情况,稍后我们再讨论).指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM. 再按照惯例,大家 ( 假装 ) 看不懂,然后我来举个栗子解释一番...好,还是不知所云,本文结束 ( Ctrl + F4 ) ,下一篇. 为了避免上述情况出现,就不解释了.实际上官方提供了很多内置指令,

  • Vue自定义指令拖拽功能示例

    下面给大家分享vue自定义指令拖拽功能代码,具体代码如下所示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>实例方法</title> <meta name="viewport" content="width=device-width, initial-scale=1

随机推荐