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

相关文章

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

Java高效实现PowerPoint转PDF的示例详解

《Java高效实现PowerPoint转PDF的示例详解》在日常开发或办公场景中,经常需要将PowerPoint演示文稿(PPT/PPTX)转换为PDF,本文将介绍从基础转换到高级设置的多种用法,大家... 目录为什么要将 PowerPoint 转换为 PDF安装 Spire.Presentation fo

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

python中的高阶函数示例详解

《python中的高阶函数示例详解》在Python中,高阶函数是指接受函数作为参数或返回函数作为结果的函数,下面:本文主要介绍python中高阶函数的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录1.定义2.map函数3.filter函数4.reduce函数5.sorted函数6.自定义高阶函数

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS