一、vue2
1. vue-clipboard2
npm install --save vue-clipboard2
import Vue from "vue"
import VueClipboard from 'vue-clipboard2'
Vue.use(VueClipboard)
<button type="button"
v-clipboard:copy="`copy`"
v-clipboard:success="copySuccess"
v-clipboard:error="copyError">copy</button>
methods: {
copySuccess() {
console.log("success");
},
copyError() {
console.log("error");
}
}
<button @click="copyData">copy</button>
methods: {
copyData() {
this.$copyText("copy text").then(
(e) => {
alert("复制成功");
console.log(e);
},(e) =>{
alert("复制失败");
console.log(e);
}
);
}
}
2. 自定义指令
- 创建指令目录文件
- 在项目的 src 目录下创建一个 directive 文件夹用来存放所有的指令代码文件
- 创建 index.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 Directive from "@/directive/index.js";
Vue.use(Directive);
const copy = {
bind(el, binding) {
el.$value = binding.value;
el.copyFun = () => {
if (!el.$value) {
console.log("暂无复制内容");
return;
}
const textarea = document.createElement("textarea");
textarea.value = el.$value;
document.body.appendChild(textarea);
textarea.select();
try {
const result = document.execCommand("Copy");
if (result) {
console.log("复制成功");
} else {
console.log("复制失败");
}
} catch {
console.log("复制失败,请检查浏览器是否兼容");
}
document.body.removeChild(textarea);
};
el.addEventListener("click", el.copyFun);
},
componentUpdated(el, binding) {
el.$value = binding.value;
},
unbind(el) {
el.removeEventListener("click", el.copyFun);
},
};
export default copy;
<button v-copy="`这是你要复制的文本`">v-copy</button>
二、vue3
1. vue-clipboard3
npm install --save vue-clipboard3
<template>
<button @click="copy">copy</button>
</template>
<script setup>
import useClipboard from 'vue-clipboard3'
const { toClipboard } = useClipboard()
const copy = async () => {
try {
await toClipboard("copy")
console.log("success")
} catch (e) {
console.log("error", e)
}
}
</script>
2. 自定义指令
- 创建指令目录文件
- 在项目的 src 目录下创建一个 directive 文件夹用来存放所有的指令代码文件
- 创建 index.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 Directive from "@/directive/index.js";
Vue.use(Directive);
import { ElMessage } from "element-plus";
const copyText = (text) => {
const textarea = document.createElement("textarea");
textarea.value = text;
document.body.appendChild(textarea);
textarea.select();
const successful = document.execCommand("copy");
if (successful) {
ElMessage.success("复制成功");
} else {
ElMessage.error("复制失败");
}
document.body.removeChild(textarea);
return successful;
};
const copy = {
mounted(el, binding) {
el.addEventListener("click", () => {
if (binding.value) {
const text =
typeof binding.value === "string"
? binding.value
: binding.value.text;
copyText(text);
}
});
},
};
export default copy;
import { ElMessage } from "element-plus";
import useClipboard from "vue-clipboard3";
const copyText = (text) => {
const { toClipboard } = useClipboard();
return new Promise((resolve, reject) => {
try {
toClipboard(text);
ElMessage.success("复制成功");
resolve(text);
} catch (e) {
ElMessage.error("复制失败");
reject(e);
}
});
};
const copy = {
mounted(el, binding) {
el.addEventListener("click", () => {
if (binding.value) {
const text =
typeof binding.value === "string"
? binding.value
: binding.value.text;
copyText(text);
}
});
},
};
export default copy;
<el-button v-copy="`这是你要复制的文本`">copyText</el-button>