feat(use): add useClickAway

This commit is contained in:
chenjiahan
2020-09-12 21:29:08 +08:00
parent a58da5570b
commit 195f3ffea1
8 changed files with 37 additions and 92 deletions
-21
View File
@@ -1,21 +0,0 @@
import { Ref } from 'vue';
import { useGlobalEvent } from './use-global-event';
export type UseClickOutsideOpitons = {
event: string;
callback: EventListener;
element: Ref<Element>;
flag?: Ref<boolean>;
};
export function useClickOutside(options: UseClickOutsideOpitons) {
const { event = 'click', callback, element, flag } = options;
function onClick(event: Event) {
if (!element.value.contains(event.target as Node)) {
callback(event);
}
}
useGlobalEvent(document, event, onClick, false, flag);
}
-50
View File
@@ -1,50 +0,0 @@
import { on, off } from '../utils/dom/event';
import {
Ref,
unref,
watch,
onMounted,
onActivated,
onUnmounted,
onDeactivated,
} from 'vue';
export function useGlobalEvent(
target: EventTarget | Ref<EventTarget>,
event: string,
handler: EventListener,
passive = false,
flag?: Ref<boolean>
) {
let binded: boolean;
const add = () => {
const element = unref(target);
if (binded || (flag && !flag.value) || !element) {
return;
}
on(element, event, handler, passive);
binded = true;
};
const remove = () => {
const element = unref(target);
if (binded && element) {
off(element, event, handler);
binded = false;
}
};
if (flag) {
watch(flag, () => {
flag.value ? add() : remove();
});
}
onMounted(add);
onActivated(add);
onUnmounted(remove);
onDeactivated(remove);
}