34 lines
1.1 KiB
TypeScript
34 lines
1.1 KiB
TypeScript
import { message } from "@/utils/message";
|
|
import { useEventListener } from "@vueuse/core";
|
|
import { copyTextToClipboard } from "@pureadmin/utils";
|
|
import type { Directive, DirectiveBinding } from "vue";
|
|
|
|
interface CopyEl extends HTMLElement {
|
|
copyValue: string;
|
|
}
|
|
|
|
/** 文本复制指令(默认双击复制) */
|
|
export const copy: Directive = {
|
|
mounted(el: CopyEl, binding: DirectiveBinding) {
|
|
const { value } = binding;
|
|
if (value) {
|
|
el.copyValue = value;
|
|
const arg = binding.arg ?? "dblclick";
|
|
// Register using addEventListener on mounted, and removeEventListener automatically on unmounted
|
|
useEventListener(el, arg, () => {
|
|
const success = copyTextToClipboard(el.copyValue);
|
|
success
|
|
? message("复制成功", { type: "success" })
|
|
: message("复制失败", { type: "error" });
|
|
});
|
|
} else {
|
|
throw new Error(
|
|
'[Directive: copy]: need value! Like v-copy="modelValue"'
|
|
);
|
|
}
|
|
},
|
|
updated(el: CopyEl, binding: DirectiveBinding) {
|
|
el.copyValue = binding.value;
|
|
}
|
|
};
|