UNPKG

1.81 kBPlain TextView Raw
1import { Directive, DirectiveBinding, isRef } from "vue";
2
3import { TriggerEventType } from "./types";
4interface ContextmenuDirectiveValue {
5 trigger?: TriggerEventType | TriggerEventType[];
6}
7
8interface ContextmenuDirectiveEl extends Element {
9 $contextmenuKey?: string;
10}
11type ContextmenuDirectiveBinding = DirectiveBinding<ContextmenuDirectiveValue>;
12
13// FIXME
14type ContextmenuRef = any;
15
16const 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
47const 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
61const rebind = (
62 el: ContextmenuDirectiveEl,
63 binding: ContextmenuDirectiveBinding,
64): void => {
65 unbind(el, binding);
66 bind(el, binding);
67};
68
69const contextmenuDirective: Directive<
70 ContextmenuDirectiveEl,
71 ContextmenuDirectiveValue
72> = {
73 mounted: bind,
74 updated: rebind,
75 beforeUnmount: unbind,
76};
77
78export default contextmenuDirective;