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

news2024/11/26 20:34:02

自定义指令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.ts

import { 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1092700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PyTorchTensorBoard实战】GPU与CPU的计算速度对比(附代码)

0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解&#xff0c;但是内容可能存在不准确的地方。如果发现文中错误&#xff0c;希望批评指正&#xff0c;共同进步。 本文基于PyTorch通过tensor点积所需要的时…

【VSCode】Windows环境下,VSCode 搭建 cmake 编译环境(VSCode 插件配置)

目录 一、下载编译器 1、下载 Windows GCC 2、选择编译器路径 二、下载插件 三、配置 cmake generator 四、编译工程 一、下载编译器 1、下载 Windows GCC 这里是在Windows环境下&#xff0c;所以下载的是 Windows 环境使用的 gcc 编译器。 下载地址: MinGW-w64 - for…

【数据库系统概论】第九章关系查询处理何查询优化

9.1查询处理 一&#xff1a;查询处理步骤 关系数据库管理系统查询处理可以分为4个阶段&#xff1a; 查询分析查询检查查询优化查询执行 &#xff08;1&#xff09;查询分析 任务&#xff1a;对查询语句进行扫描&#xff0c;分析词法、语法是否符合SQL语法规则 如果没有语…

[MySQL]存储引擎、索引、SQL优化

文章目录 1. 存储引擎1.1 MySQL体系结构1.2 存储引擎简述1.3 存储引擎的特点1.3.1 innoDB1.3.2 MyISAM1.3.3 Memory1.3.4 存储引擎的选择 2. Linux下的MySQL3. 索引3.1 索引概述3.2 索引结构3.3 索引分类3.4 索引语法3.5 索引性能分析3.6 索引的使用3.6.1 索引失效3.6.2 索引使…

【LeetCode刷题(数据结构)】:给定一个链表 每个节点包含一个额外增加的随机指针 该指针可以指向链表中的任何节点或空节点 要求返回这个链表的深度拷贝

给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节点的 next…

深入探索BP神经网络【简单原理、实际应用和Python示例】

人工神经网络&#xff08;Artificial Neural Networks&#xff09;是一种受到生物神经网络启发的机器学习模型&#xff0c;它的应用范围广泛&#xff0c;包括图像识别、语音识别、自然语言处理等领域。其中&#xff0c;BP神经网络&#xff08;Backpropagation Neural Network&a…

学习笔记-MongoDB(复制集,分片集集群搭建)

复制集群搭建 基本介绍 什么是复制集&#xff1f; 复制集是由一组拥有相同数据集的MongoDB实例做组成的集群。 复制集是一个集群&#xff0c;它是2台及2台以上的服务器组成&#xff0c;以及复制集成员包括Primary主节点&#xff0c;Secondary从节点和投票节点。 复制集提供了…

花2个月时间学习,面华为测开岗要30k,面试官竟说:你不是在搞笑。。。

背景介绍 计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比较短&#xff08;小于两个月&#xff09;&#xff0c;于是找的实习是…

通用考勤后台管理系统

考勤后台系统&#xff0c;包括待办事项、人员管理、任务中心、任务详情、我的任务、客户管理、考勤功能几大功能&#xff0c;本后台系统以考勤打卡为主要功能&#xff0c;采用分屏布局的方式&#xff0c;简洁大方&#xff0c;使用方便

mysqlbinlog 日用记录

我是同步覆盖了两张表&#xff0c;现在想用日志恢复。 先说结论&#xff0c;没有恢复&#xff0c;因为我的日志不完整&#xff0c;设置了定时清理。 如果你truncate了表或者数据库&#xff0c;如果没有完整的日志是恢复不了数据的。 第一、mysqlbinlog 可能没开启 第二、开…

C++入门 第一篇(C++关键字, 命名空间,C++输入输出)

目录 1. C关键字 2. 命名空间 2.1 命名空间定义 2.2命名空间的使用 命名空间的使用有三种方式&#xff1a; 1.加命名空间名称及作用域限定符 2.使用using将命名空间中某个成员引入 3.使用using namespace 命名空间名称 引入 3. C输入&输出 4.缺省函数 4.1 缺省参…

微信开发者工具下载

一、微信开发者工具下载官网 微信开发者工具下载地址与更新日志 | 微信开放文档 (qq.com) 二、微信开发者工具界面 下载安装好后&#xff0c;软件图标如下图所示。 运行软件如下图所示&#xff0c;这时候就需要使用你的管理员账号扫码登录。 登陆后的界面&#xff0c;如下图…

为知笔记一个日记模板

<!DOCTYPE HTML><html><head> <meta http-equiv"Content-Type" content"text/html; charsetunicode"> <title>日记&#xff1a;</title><style id"wiz_custom_css">html, .wiz-editor-body {font-siz…

Lua调用C#类

先创建一个Main脚本作为主入口&#xff0c;挂载到摄像机上 public class Main : MonoBehaviour {// Start is called before the first frame updatevoid Start(){LuaMgr.GetInstance().Init();LuaMgr.GetInstance().DoLuaFile("Main");}// Update is called once p…

Stm32_标准库_11_ADC_光敏热敏传感器_测数值

在测量光敏传感器数值得基础上手动将通道改成热敏传感器通道即可 由于温度传感器的测量范围是-20 ~ 105摄氏度&#xff0c;所以输出温度得考虑带上符号这就需要在原有输出光照强度代码的基础上新添加几个函数 函数1&#xff1a; uint16_t AD_Getvailue(uint8_t ADC_Channel){…

C# PortraitModeFilter (人物图片)背景模糊

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Windows.Forms; us…

python文本转语音

概述 目前有文本转语音的技术&#xff0c;可以用在配音领域&#xff0c;我个人因为一些需求&#xff0c;所以开始寻找这方面的资源&#xff0c;目前各大平台&#xff0c;比如腾讯&#xff0c;讯飞&#xff0c;阿里&#xff0c;百度等都有这样的API服务&#xff0c;我个人是是使…

Multi Scale Supervised 3D U-Net for Kidney and Tumor Segmentation

目录 摘要1 引言2 方法2.1 预处理和数据增强2.2 网络的体系结构2.3 训练过程2.4 推理与后处理 3 实验与结果4 结论与讨论 摘要 U-Net在各种医学图像分割挑战中取得了巨大成功。一些新的、带有花里胡哨功能的架构可能在某些数据集中在使用最佳超参数时取得成功&#xff0c;但它们…

力扣-463.岛屿的周长

Idea 注意观察&#xff0c;每一个完整的方块&#xff0c;边长都是加4&#xff0c;一旦这个方块有其他的方块相邻的话&#xff0c;那么这两个方块总边长就要减少2. 因此我们遍历二维数组的时候&#xff0c;判断岛屿方块的上面还有左方是否有相邻即可 class Solution { public:in…

Linux 64位 C++协程池原理分析及代码实现

导语 本文介绍了协程的作用、结构、原理&#xff0c;并使用C和汇编实现了64位系统下的协程池。文章内容避免了协程晦涩难懂的部分&#xff0c;用大量图文来分析原理&#xff0c;适合新手阅读学习。 GitHub源码 1. Web服务器问题 现代分布式Web后台服务逻辑通常由一系列RPC请…