1 | import { Directive, DirectiveBinding, isRef } from "vue";
|
2 |
|
3 | import { TriggerEventType } from "./types";
|
4 | interface ContextmenuDirectiveValue {
|
5 | trigger?: TriggerEventType | TriggerEventType[];
|
6 | }
|
7 |
|
8 | interface ContextmenuDirectiveEl extends Element {
|
9 | $contextmenuKey?: string;
|
10 | }
|
11 | type ContextmenuDirectiveBinding = DirectiveBinding<ContextmenuDirectiveValue>;
|
12 |
|
13 |
|
14 | type ContextmenuRef = any;
|
15 |
|
16 | const bind = (
|
17 | el: ContextmenuDirectiveEl,
|
18 | binding: ContextmenuDirectiveBinding,
|
19 | ): void => {
|
20 | const contextmenuKey = binding.arg;
|
21 |
|
22 | if (!contextmenuKey) {
|
23 | console.error("参数有误");
|
24 | return;
|
25 | }
|
26 |
|
27 | const contextmenuOptions = binding.value;
|
28 | const contextmenuRef: ContextmenuRef = isRef(contextmenuKey)
|
29 | ? contextmenuKey.value
|
30 | : binding.instance?.$refs[contextmenuKey];
|
31 |
|
32 | if (!contextmenuRef) {
|
33 | console.error(`没有找到 ${contextmenuKey} 对应的实例`);
|
34 | return;
|
35 | }
|
36 |
|
37 | if (typeof contextmenuRef.addReference !== "function") {
|
38 | console.error(`${contextmenuKey} 对应的实例不是 VContextmenu`);
|
39 | return;
|
40 | }
|
41 |
|
42 | el.$contextmenuKey = contextmenuKey;
|
43 |
|
44 | contextmenuRef.addReference(el, contextmenuOptions);
|
45 | };
|
46 |
|
47 | const unbind = (
|
48 | el: ContextmenuDirectiveEl,
|
49 | binding: ContextmenuDirectiveBinding,
|
50 | ): void => {
|
51 | const contextmenuKey = el.$contextmenuKey;
|
52 |
|
53 | if (!contextmenuKey) return;
|
54 |
|
55 | const contextmenuRef: ContextmenuRef =
|
56 | binding.instance?.$refs[contextmenuKey];
|
57 |
|
58 | contextmenuRef?.removeReference(el);
|
59 | };
|
60 |
|
61 | const rebind = (
|
62 | el: ContextmenuDirectiveEl,
|
63 | binding: ContextmenuDirectiveBinding,
|
64 | ): void => {
|
65 | unbind(el, binding);
|
66 | bind(el, binding);
|
67 | };
|
68 |
|
69 | const contextmenuDirective: Directive<
|
70 | ContextmenuDirectiveEl,
|
71 | ContextmenuDirectiveValue
|
72 | > = {
|
73 | mounted: bind,
|
74 | updated: rebind,
|
75 | beforeUnmount: unbind,
|
76 | };
|
77 |
|
78 | export default contextmenuDirective;
|