feat: 新增点击空白关闭指令
Former-commit-id: b972dcaec196fe3e5a261cebfece91d3596a51ab
This commit is contained in:
52
src/directive/ClickOutside/index.ts
Normal file
52
src/directive/ClickOutside/index.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
import { Directive } from 'vue';
|
||||
|
||||
declare type NoNameFUnctionReturnVoid = () => void;
|
||||
|
||||
export const clickOutside: Directive<HTMLElement, NoNameFUnctionReturnVoid> =
|
||||
(() => {
|
||||
const checkIfClickedInside = (
|
||||
event: Event,
|
||||
element: HTMLElement,
|
||||
callBackFn: NoNameFUnctionReturnVoid
|
||||
) => {
|
||||
console.log('element', element);
|
||||
const isInside = event.composedPath().includes(element);
|
||||
|
||||
if (isInside) {
|
||||
return false;
|
||||
} else {
|
||||
callBackFn();
|
||||
}
|
||||
};
|
||||
|
||||
const allListeners: {
|
||||
element: HTMLElement;
|
||||
listener: (e: Event) => void;
|
||||
}[] = [];
|
||||
|
||||
return {
|
||||
created(element) {
|
||||
element.dataset.clicked = 'false';
|
||||
},
|
||||
|
||||
mounted(element, binding) {
|
||||
const myListener = (e: Event) => {
|
||||
checkIfClickedInside(e, element, binding.value);
|
||||
};
|
||||
allListeners.push({ element, listener: myListener });
|
||||
window.addEventListener('click', myListener);
|
||||
},
|
||||
|
||||
unmounted(element) {
|
||||
const eventIndex = allListeners.findIndex(
|
||||
listener => listener.element === element
|
||||
);
|
||||
|
||||
if (eventIndex !== -1) {
|
||||
const listener = allListeners[eventIndex].listener;
|
||||
window.removeEventListener('click', listener);
|
||||
allListeners.splice(eventIndex, 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
})();
|
||||
15
src/directive/Debounce/index.ts
Normal file
15
src/directive/Debounce/index.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { Directive } from 'vue';
|
||||
|
||||
/**
|
||||
* 按钮防抖
|
||||
*/
|
||||
export const deBounce: Directive = {
|
||||
mounted(el: HTMLElement) {
|
||||
el.addEventListener('click', () => {
|
||||
el.classList.add('is-disabled');
|
||||
setTimeout(() => {
|
||||
el.classList.remove('is-disabled');
|
||||
}, 2000);
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -1,2 +1,3 @@
|
||||
export { hasPerm, hasRole } from './permission';
|
||||
export { deBounce } from './utils';
|
||||
export { clickOutside } from './ClickOutside';
|
||||
export { deBounce } from './Debounce';
|
||||
|
||||
@@ -2,7 +2,7 @@ import { useUserStoreHook } from '@/store/modules/user';
|
||||
import { Directive, DirectiveBinding } from 'vue';
|
||||
|
||||
/**
|
||||
* 按钮权限校验
|
||||
* 按钮权限
|
||||
*/
|
||||
export const hasPerm: Directive = {
|
||||
mounted(el: HTMLElement, binding: DirectiveBinding) {
|
||||
@@ -32,7 +32,7 @@ export const hasPerm: Directive = {
|
||||
};
|
||||
|
||||
/**
|
||||
* 角色权限校验
|
||||
* 角色权限
|
||||
*/
|
||||
export const hasRole: Directive = {
|
||||
mounted(el: HTMLElement, binding: DirectiveBinding) {
|
||||
|
||||
Reference in New Issue
Block a user