2. vue-sy-admin: 基于vue3+TypeScript的自定义指令(directives)的封装及示例

2023-10-14 08:44

本文主要是介绍2. vue-sy-admin: 基于vue3+TypeScript的自定义指令(directives)的封装及示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

自定义指令directives在项目特别是后台管理类的项目中使用的尤其多(个人经验),每个人编写的自定义指令也各不相同,一个人的时候还没啥感觉,在多人合作的项目中统一编码规范就变得很有必要了,这样看着舒服的同时也更方便后期维护。

题外话: 强烈推荐使用 vueuse,该库由vue核心成员开发,封装了各种常用hooks,能够省很多不必要的开发时间,且其中的封装hooks思想也很值得学习参考

最终效果如下图所示

Snipaste_2023-10-13_12-20-15.png

1. directives自定义指令创建及类型参数声明

src/directives目录下新建 index.tstypes.ts 分别用于自定义指令directives的注册及全局指令参数声明。另新建目录modules用于存放各种不同的指令实现代码。

// index.ts
import type { App } from 'vue';
import type { DirectiveOptions, Keys } from './types';export default async function directives(app: App) {// 项目是用 vite 创建,import.meta.glob 用于导入 /modules 下所有指令实现代码const files = import.meta.glob('./modules/*.ts');for (const key in files) {const file: any = await files[key]();if (file) {const direct = file.default as DirectiveOptions<Keys>;app.directive(direct.name, direct.directive);}}
}
// types.ts
import type { Directive } from 'vue';
type EventTypes = 'click' | 'input';export interface ELType extends HTMLElement {__fn__: () => any;
}export interface Directives {vFocus: Directive; // 聚焦vDebounce: Directive<any,{type?: EventTypes;delay?: number;callback: (...args: any[]) => void;}>; // 防抖
}export type Keys = keyof Directives;// 指令名转小写
type LowerDirectiveName<T extends Keys> = T extends `v${infer V}`? Lowercase<V>: never;// 指令对象类型
export interface DirectiveOptions<T extends Keys> {name: LowerDirectiveName<T>;directive: Directives[T];
}

注:types.ts导出接口声明Directives主要用于在vue组件的ComponentCustomProperties中作声明使用。

聚焦指令(v-focus)实现
import type { DirectiveOptions } from '../types';const focusDirective: DirectiveOptions<'vFocus'> = {name: 'focus',directive: {mounted: (el: HTMLInputElement) => el.focus(),},
};export default focusDirective;
防抖指令(v-debounce)代码实现
// modules/debounce.tsimport { useDebounceFn } from '@vueuse/core'
import type { DirectiveOptions, ELType } from '../types';const focusDirective: DirectiveOptions<'vDebounce'> = {name: 'debounce',directive: {mounted: (el: ELType, { value }, vnode) => {const { type = 'input', delay, callback } = value;el.__fn__ = useDebounceFn(callback.bind(vnode), delay ?? 300);el.addEventListener(type, el.__fn__);},beforeUnmount: (el: ELType, { value }) => {el.removeEventListener(value.type || 'input', el.__fn__);},},
};export default focusDirective;

2. 注册自定义指令directives

在入口文件 main.ts中引入并注册即可

// main.ts
import { createApp } from 'vue';
import directives from './directives';const app = createApp(App);
app.use(directives);
app.mount('#app');

3. 为.vue文件添加自定义指令类型声明

// global-properties.d
import type { Component } from 'vue';
import type { Filter } from '../src/filters/types';
import type { Directives } from '@/directives/types';declare module 'vue' {// 在这里直接继承 Directives 即可interface ComponentCustomProperties  extendsComponent, Directives {$filters: Filter;}
}

注:别忘了将该文件加入tsconfig.json的include配置项中,否则在.vue文件的template中使用将不会出现类型提示。

在线代码可查看:vue-sy-admin
简易模板可查看:vue-vite-template

这篇关于2. vue-sy-admin: 基于vue3+TypeScript的自定义指令(directives)的封装及示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/209405

相关文章

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言