feat(use): add useClickAway
This commit is contained in:
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user