vue自定义指令——v-copy(基于vue-clipboard2)

directives/copy/index.js

import Clipboard from './clipboard'

const install = function (Vue) {
    Vue.directive('Clipboard', Clipboard)
}

if (window.Vue) {
    window.clipboard = Clipboard
    Vue.use(install); // eslint-disable-line
}

Clipboard.install = install
export default Clipboard
/**
 * 指令的使用方法(两种)
 * 第一种:
 * <el-button v-copy:copy="copyText" v-copy:success="onCopy" v-copy:error="onError">复制</el-button>
 *  
 *  onCopy(e) {
            this.$message.success(this.$t("layout.copySuccess"));
        },
    onError(e) {
            this.$message.error(this.$t("layout.copyError"));
        },
 * 第二种:
 *import clip from "@/utils/clipboard"; 
 * <el-button  @click="handleCopy(title, $event)">复制</el-button>
 *    handleCopy(text, event) {
            clip(text, event);
        },
 */

directives/copy/clipboard.js

// 引入Clipboard模块
const Clipboard = require('clipboard');

// 检查是否成功安装了clipboard模块
if (!Clipboard) {
    console.error('未找到Clipboard模块,请确保通过npm正确安装了`clipboard`模块。');
}

export default {
    bind(el, binding) {
        // 检查参数是否为success或error
        if (binding.arg === 'success') {
            // 将成功的回调函数保存到元素属性中
            el._v_clipboard_success = binding.value;
        } else if (binding.arg === 'error') {
            // 将失败的回调函数保存到元素属性中
            el._v_clipboard_error = binding.value;
        } else {
            // 创建Clipboard实例
            const clipboard = new Clipboard(el, {
                text() { return binding.value },
                action() { return binding.arg === 'cut' ? 'cut' : 'copy' }
            });

            // 监听复制成功事件
            clipboard.on('success', e => {
                const callback = el._v_clipboard_success;
                callback && callback(e); // eslint-disable-line
            });

            // 监听复制失败事件
            clipboard.on('error', e => {
                const callback = el._v_clipboard_error;
                callback && callback(e); // eslint-disable-line
            });

            // 保存Clipboard实例到元素属性中
            el._v_clipboard = clipboard;
        }
    },
    update(el, binding) {
        // 如果值和参数都没有变化,可以避免不必要的操作
        if (binding.value === el._v_clipboard.text() && binding.arg === (el._v_clipboard.action() === 'cut' ? 'cut' : 'copy')) {
            return;
        }

        // 更新成功和失败的回调
        if (binding.arg === 'success') {
            el._v_clipboard_success = binding.value;
        } else if (binding.arg === 'error') {
            el._v_clipboard_error = binding.value;
        } else {
            // 更新Clipboard实例的文本和操作类型
            el._v_clipboard.text = function () { return binding.value };
            el._v_clipboard.action = function () { return binding.arg === 'cut' ? 'cut' : 'copy' };
        }
    },
    unbind(el, binding) {
        // 根据参数,删除相应的回调函数或销毁Clipboard实例
        if (binding.arg === 'success') {
            delete el._v_clipboard_success;
        } else if (binding.arg === 'error') {
            delete el._v_clipboard_error;
        } else {
            el._v_clipboard.destroy();
            delete el._v_clipboard;
        }
    }
}


utils/clipboard.js

import Vue from 'vue'
import Clipboard from 'clipboard'

function clipboardSuccess() {
    Vue.prototype.$message({
        message: 'Copy successfully',
        type: 'success',
        duration: 1500
    })
}

function clipboardError() {
    Vue.prototype.$message({
        message: 'Copy failed',
        type: 'error'
    })
}

export default function handleClipboard(text, event) {
    const clipboard = new Clipboard(event.target, {
        text: () => text
    })
    clipboard.on('success', () => {
        clipboardSuccess()
        clipboard.destroy()
    })
    clipboard.on('error', () => {
        clipboardError()
        clipboard.destroy()
    })
    clipboard.onClick(event)
}
  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vue-clipboard2是一个Vue.js插件,用于实现在Vue项目中复制文本内容或图片的功能。你可以通过安装和配置vue-clipboard2来使用它。 首先,你需要在你的项目中安装vue-clipboard2插件。可以使用npm或yarn命令来安装: ``` npm install vue-clipboard2 ``` 或 ``` yarn add vue-clipboard2 ``` 然后,在项目的main.js文件中引入vue-clipboard2插件,并配置autoSetContainer为true,以便自动设置复制容器: ``` import VueClipboard from 'vue-clipboard2' VueClipboard.config.autoSetContainer = true Vue.use(VueClipboard) ``` 接下来,你可以在你的Vue组件中使用v-clipboard指令来实现复制功能。例如,当点击一个div时复制相应的内容,可以按照以下方式编写代码: ```html <template> <div v-clipboard:copy="code" v-clipboard:success="onCopy" v-clipboard:error="onCopyError">点击复制</div> </template> ``` ```javascript data: function() { return { code: '我是复制的内容' } }, methods: { onCopy: function(e) { alert('复制内容 ' + e.text + '成功!'); }, onCopyError: function() { alert('您的手机系统不支持自动复制,请手动复制!'); } } ``` 这样,当点击该div时,相应的内容将被复制到剪贴板中,并触发相应的成功或失败回调函数。 如果你想复制图片,可以将img标签包装在一个div中,并在div上添加v-clipboard指令。例如: ```html <div v-clipboard:copy="code" v-clipboard:success="onCopy" v-clipboard:error="onCopyError"> <img src="xxxx" alt=" " /> </div> ``` 这样,当点击该div时,图片将被复制到剪贴板中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值