vue点击复制内容

自定义全局指令v-copy

原理

动态创建<textarea>标签,将要复制的值传入,再调用document.execCommand方法,随后移除新创建的<textarea>标签

定义

copyComment.js

import { Message } from 'element-ui'
const vCopy = { // 名字爱取啥取啥
    /*
      bind 钩子函数,第一次绑定时调用,可以在这里做初始化设置
      el: 作用的 dom 对象
      value: 传给指令的值,也就是我们要 copy 的值
    */
    bind(el, { value }) {
        el.$value = value; // 用一个全局属性来存传进来的值,因为这个值在别的钩子函数里还会用到
        el.handler = () => {
            if (!el.$value) {
                // 值为空的时候,给出提示,我这里的提示是用的 element-UI 的提示,你们随意
                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;

directives.js文件

import copy from './copyComment.js';
// 自定义指令
const directives = {
    copy,
};
// 这种写法可以批量注册指令
export default {
    install(Vue) {
        Object.keys(directives).forEach((key) => {
            Vue.directive(key, directives[key]);
        });
    },
};
使用
<p v-copy='我就是复制内容'>点击复制</p>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值