结构目录
- directives --------------------------------------------指令目录
- index.ts-------------------------------------------统一注册
- onClickRemoveOrAddClass.ts--------------------------点击元素移除指定类名的指令
1.index.ts文件
import type { App } from "vue";
const modules = import.meta.glob("./**/*.ts");
console.log("modules", modules);
const directives = {
install: function (app: App<Element>) {
Object.keys(modules).forEach(async key => {
if (key !== "./index.ts") {
const reg =
const match = key.match(reg);
const name = match?.[1];
const direct = await modules[key]();
console.log("name", name);
name && app.directive(name, (direct as any)?.default);
}
});
}
};
export default directives;
2.onClickRemoveOrAddClass.ts文件
import type { Directive, DirectiveBinding } from "vue";
const removeOrAddClassDirective: Directive = {
mounted(el: HTMLElement, binding: DirectiveBinding) {
const classNames = binding.value;
const handleRemoveOrAddClass = (el: HTMLElement, className: string) => {
Array.from(el.classList).includes(className)
? el.classList.remove(className)
: el.classList.add(className);
};
const handleClick = (event: MouseEvent) => {
if (event.target instanceof Element && classNames) {
if (Array.isArray(classNames)) {
classNames.forEach(className => {
handleRemoveOrAddClass(el, className);
});
} else {
handleRemoveOrAddClass(el, classNames);
}
}
};
el.addEventListener("click", handleClick);
}
};
export default removeOrAddClassDirective;
2.注册使用
1.单独注册
import onClickRemoveOraddClass from './direct/onClickRemoveOraddClass'
app.directive('on-click-remove-or-add-class', onClickRemoveOraddClass);
1.统一注册
import directives from "@/directives";
app.use(directives);
示例代码
<template>
<div class="box" v-on-click-remove-or-add-class="['pink']"></div>
</template>
