文章目录

  • 1. 前言
  • 2. 基础概念与优势​
  • 3. Vue3+TS自定义指令的创建与注册​
    • 3.1. 创建自定义指令​
    • 3.2. 注册自定义指令​
  • 4. 实际场景示例​
    • 4.1. 权限指令控制​
    • 4.2. 图片懒加载指令​
  • 5. 优化与注意事项​

1. 前言

在 Vue3 的开发生态中,自定义指令是一项极为灵活且强大的功能,它允许开发者对 DOM 元素进行底层操作,实现复用性高的特定逻辑。结合 TypeScript(TS)强类型的特性,能让自定义指令的开发更加规范、安全,减少运行时错误。本文将深入讲解基于 Vue3 + TS 的自定义指令开发,并通过实际的业务场景做一些示例。​

2. 基础概念与优势​

在 Vue 中,指令(Directives)是以v-为前缀的特殊属性,用于在模板中实现对 DOM 的操作。除了 Vue 自带的指令(如v-bind、v-on),开发者还可以根据业务需求创建自定义指令。自定义指令的核心作用是抽象出可复用的 DOM 操作逻辑,将其封装在指令中,在不同组件中重复使用,从而提高代码的复用性和开发效率。​

Vue3 + TS 开发自定义指令的优势​:

  • 类型安全:TypeScript 的强类型系统能在开发阶段就检测出类型不匹配等错误,避免因数据类型问题导致的运行时错误。例如,在定义指令的钩子函数参数类型时,明确的类型声明能让开发者更清晰地知道每个参数的用途和数据类型,同时在编辑器中获得智能提示,提升编码效率。​

  • 代码规范与维护性:TS 的类型定义和接口约束,能让代码结构更加清晰。团队成员可以通过类型声明快速理解代码意图,降低代码维护成本。在大型项目中,统一的类型规范有助于保持代码风格的一致性,减少沟通成本。​

  • 更好的代码重构支持:当项目需求变更,需要对自定义指令进行重构时,TS 强大的类型检查机制能帮助开发者快速定位因代码修改导致的类型错误,确保重构后的代码逻辑正确,降低重构风险。​

3. Vue3+TS自定义指令的创建与注册​

下面是一个完整的流程示例:

3.1. 创建自定义指令​

在 Vue3 中,使用app.directive方法来注册自定义指令。结合 TS,我们可以通过定义接口和类型别名来规范指令的参数和钩子函数。

以下是一个简单的示例,创建一个自定义指令v-focus,用于在元素插入 DOM 时自动获取焦点:​

import { App, Directive, DirectiveBinding } from 'vue';​
​
// 定义指令钩子函数的参数类型​
interface FocusDirectiveBinding extends DirectiveBinding {​value: boolean;}​
​
// 创建自定义指令​
const focusDirective: Directive<HTMLElement, FocusDirectiveBinding> = {// 当指令绑定到元素时调用​mounted(el: HTMLElement, binding: FocusDirectiveBinding) {if (binding.value) {​el.focus();}}};​
​
export default focusDirective;

在上述代码中:​

  • 首先导入了App、Directive和DirectiveBinding等类型,用于定义指令相关的类型和接口。​
  • 接着定义了FocusDirectiveBinding接口,扩展了DirectiveBinding,明确了指令绑定值value的类型为boolean。​
  • 然后创建了focusDirective,它是一个实现了Directive接口的对象,包含了mounted钩子函数。在mounted钩子中,根据binding.value的值判断是否让元素获取焦点。​

3.2. 注册自定义指令​

注册自定义指令有两种方式:全局注册和局部注册。​

全局注册:在main.ts文件中,将自定义指令注册到整个 Vue 应用中,使其在所有组件中都可用。​

import { createApp } from 'vue';import App from './App.vue';import focusDirective from './directives/focus';​
​
const app = createApp(App);​
app.directive('focus', focusDirective);​
app.mount('#app');

局部注册:在组件内部注册自定义指令,仅在当前组件及其子组件中生效。​

	<template><input v-focus="isFocused" type="text" /></template>​​<script lang="ts">import { defineComponent } from 'vue';import focusDirective from '../directives/focus';​​export default defineComponent({​directives: {​focus: focusDirective​},data() {return {​isFocused: true};}});</script>

4. 实际场景示例​

下面列举了几个使用例子,都是开发过程中会碰到的典型示例。

4.1. 权限指令控制​

在企业级应用中,经常需要根据用户的权限来控制某些 DOM 元素的显示或隐藏。例如,只有管理员用户才能看到删除按钮,普通用户则隐藏该按钮。​

import { App, Directive, DirectiveBinding } from 'vue';​
​
// 定义权限指令的绑定值类型​
interface PermissionDirectiveBinding extends DirectiveBinding {​value: string[];}​
​
// 创建权限指令​
const permissionDirective: Directive<HTMLElement, PermissionDirectiveBinding> = {mounted(el: HTMLElement, binding: PermissionDirectiveBinding) {const userPermissions = ['admin']; // 模拟用户权限列表​const requiredPermissions = binding.value;if (!userPermissions.some(p => requiredPermissions.includes(p))) {​el.style.display = 'none';}}};​
​
export default permissionDirective;

在模板中使用该指令:​

<template><button v-permission="['admin']">删除</button></template>

4.2. 图片懒加载指令​

在图片较多的页面,使用懒加载可以提升页面加载性能。通过自定义指令实现图片的懒加载功能:​

import { App, Directive, DirectiveBinding } from 'vue';import { IntersectionObserver } from '@w3c/IntersectionObserver';​
​
// 定义懒加载指令的绑定值类型​
interface LazyLoadDirectiveBinding extends DirectiveBinding {​value: string;}​
​
// 创建懒加载指令​
const lazyLoadDirective: Directive<HTMLImageElement, LazyLoadDirectiveBinding> = {mounted(el: HTMLImageElement, binding: LazyLoadDirectiveBinding) {const observer = new IntersectionObserver(([entry]) => {if (entry.isIntersecting) {​el.src = binding.value;​observer.unobserve(el);}});​observer.observe(el);}};​
​
export default lazyLoadDirective;

在模板中使用该指令:​

<template><img v-lazy-load="imageUrl" alt="懒加载图片" /></template>

5. 优化与注意事项​

  • 缓存 DOM 操作:在指令的钩子函数中,如果涉及多次对 DOM 元素的相同操作,可以将结果缓存起来,避免重复计算,提升性能。例如,在计算元素的位置或尺寸时,可以将结果存储在变量中,后续使用时直接读取。​

  • 事件解绑:在unmounted钩子函数中,要记得解绑在mounted钩子中添加的事件监听器,防止内存泄漏。比如在上述懒加载指令中,使用IntersectionObserver观察元素时,在元素不再需要观察时,调用unobserve方法解除观察。​

  • 指令参数类型检查:在指令的钩子函数中,要对传入的参数进行严格的类型检查和合法性验证,避免因参数错误导致的异常。例如,在权限指令中,确保binding.value是一个数组类型,并且数组元素是字符串类型。​

  • 指令命名规范:自定义指令的命名要遵循一定的规范,建议采用v-前缀加上有意义的名称,方便团队成员理解和使用。同时,命名要避免与 Vue 自带的指令或项目中已有的指令冲突。​


本次分享就到这儿啦,我是鹏多多,如果您看了觉得有帮助,欢迎评论,关注,点赞,转发,我们下次见~

往期文章

  • vue中ref的详解以及react的ref对比
  • css使用aspect-ratio制作4:3和9:16和1:1等等比例布局
  • Web前端页面开发阿拉伯语种适配指南
  • flutter-使用extended_image操作图片的加载和状态处理以及缓存和下载
  • flutter-制作可缩放底部弹出抽屉评论区效果
  • flutter-实现Tabs吸顶的PageView效果
  • Vue2全家桶+Element搭建的PC端在线音乐网站
  • 助你上手Vue3全家桶之Vue3教程
  • 超详细!vue组件通信的10种方式
  • 超详细!Vuex手把手教程
  • 使用nvm管理node.js版本以及更换npm淘宝镜像源
  • vue中利用.env文件存储全局环境变量,以及配置vue启动和打包命令

个人主页

  • CSDN
  • GitHub
  • 掘金

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch 索引文档的流程

Elasticsearch 索引文档的流程是一个分布式、多阶段的过程&#xff0c;涉及客户端请求、路由、主副本同步及持久化等步骤&#xff0c;具体流程如下&#xff1a; 一、客户端请求与路由 1.1 文档接收与路由计算‌ 客户端通过 REST API 发送文档写入请求&#xff0c;需指…

【unity】批量剔除图片四周空白像素的工具

摘要&#xff1a;Unity图片空白像素批量处理工具 该工具提供两种方式批量剔除图片空白像素&#xff1a; 静态处理类&#xff1a;提供TrimTexture方法&#xff0c;可读取纹理像素数据&#xff0c;计算非透明区域边界&#xff0c;生成裁剪后的新纹理&#xff1b;SaveTexture方法…

可编辑64页PPT | 基于DeepSeek的数据治理方案

荐言摘要&#xff1a;在数据量爆炸式增长且业务需求日益复杂的当下&#xff0c;企业数据治理面临着数据分散、标准混乱、价值挖掘难等诸多挑战。我们基于DeepSeek强大的智能能力&#xff0c;为企业量身打造创新数据治理方案。 DeepSeek凭借其卓越的自然语言处理和深度学习技术…

启用AWS VPC流日志保存到CloudWatch日志组

目标 启用VPC流日志 启用流日志 选择vpc&#xff0c;开始启用流日志&#xff0c;如下图&#xff1a; 设置名称和日志组&#xff0c;创建流日志&#xff0c;如下图&#xff1a; 参考 AWS云中的VPC启用流日志保存S3&#xff08;AWS中国云&#xff09;创建发布到 CloudWatc…

游戏引擎学习路径与技术栈指南

游戏引擎架构全景图&#xff08;基于GAMES104 V2.2思维导图&#xff09; graph TDA[基础架构] --> A1[面向数据管理]A --> A2[任务系统]A1 --> A11[ECS架构]A1 --> A12[内存优化]A2 --> A21[Job System]A2 --> A22[依赖调度]B[工具链] --> B1[编辑器框架]…

预训练大语言模型

Encoder-only model&#xff08;Autoencoding model&#xff09; 使用掩码语言模型&#xff08;Masked Language Modeling, MLM&#xff09;进行预训练输入原始语句和掩码&#xff0c;训练目标是预测掩码标记&#xff0c;一遍重建原始句子->也称为降噪目标&#xff08;deno…

C++信奥赛闯关题目1

1闰年 输入一个年份,输出它是否为闰年 闰年的规则: 描述:能被4整除,并且不能被100整除的,再加上可以被400整除的 版本一:原始版 #include <iostream> #include <cmath> using namespace std; int main() {int y;cin>>y;bool x = y%4==0&&y…

Qt+OPC开发笔记(三):OPC客户端订阅特点消息的Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/148868209 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

嵌入式开发学习日志Day8(ARM体系架构——按键、蜂鸣器及中断)

一、蜂鸣器学习 代码实现&#xff1a; 二、BSP工程管理及Makefile 1、BSP工程管理 利用BSP工程管理&#xff0c;使文档显示不杂乱&#xff1b; 将这些文件分为4类&#xff0c;并保存到4个不同的文件夹里。 首先在新的工程文件夹里创建一个之后我们编写的类似led驱动&#xff0…

Linux部署Sonic前后端(详细版)(腾讯云)

系统用的是Ubuntu 22.04 LTS 1、安装Docker sudo apt update sudo apt install -y docker.io docker-compose sudo systemctl start docker sudo systemctl enable docker# 如果不想每次用 sudo&#xff0c;可以加权限 sudo usermod -aG docker $USER 2、安装 docker-compose…

腾讯云CBS:企业级云存储的性能与可靠性重构

摘要 根据Forrester 2025年网络分析与可见性&#xff08;NAV&#xff09;报告&#xff0c;东西向流量安全与加密威胁检测成为企业核心痛点&#xff08;误报率降低需求↑40%&#xff09;。腾讯云CBS作为底层存储支柱&#xff0c;通过三副本跨可用区冗余架构与毫秒级故障切换能力…

ubuntu 22.04 更换阿里源 (wsl2 参照)

步骤 1: 备份当前源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 步骤 2: 编辑源列表文件 sudo nano /etc/apt/sources.list 步骤 3: 添加阿里云镜像源 ubuntu 阿里源地址可以在这查看 ubuntu镜像_ubuntu下载地址_ubuntu安装教程-阿里巴巴开源镜像站 …

idea中push拒绝,merge,rebase的区别

在 IntelliJ IDEA 中进行 Git 操作时&#xff0c;Push 拒绝&#xff08;Push Rejected&#xff09;、Merge 和 Rebase 是常见的冲突解决方式。它们有不同的适用场景和影响&#xff0c;下面详细说明它们的区别&#xff0c;并附上流程图帮助理解。 1. Push 拒绝&#xff08;Push …

轻松实现PDF局部擦除的技术级解决方案

在处理PDF文档时&#xff0c;我们常常会遇到这样的场景&#xff1a;想要删除某段文字、擦除一张图片&#xff0c;或者对页面内容进行局部调整。但很多编辑工具要么操作繁琐&#xff0c;要么功能受限&#xff0c;甚至还需要付费解锁核心功能。 这是一款轻便又实用的PDF编辑工具…

css color 十六进制颜色透明度

css color 十六进制颜色透明度 例&#xff1a;#FFFFFF ~~ #FFFFFF1A(10% ) 0% 为 FF10% 为 1A20% 为 3330% 为 4D40% 为 6650% 为 8060% 为 9970% 为 B380% 为 CC90% 为 E6100% 为 00

Git简介和常用命令

Git简介 Git是一款版本管理软件&#xff0c;可以在任何时间点保存文件&#xff0c;也能够恢复到以前任意时间点保存的文档&#xff0c;Git作用简单举例来说就是&#xff0c;写论文&#xff0c;有很多个版本&#xff0c;将原来的论文保存起来&#xff0c;新建一个副本&#xff…

Kafka 性能调优指南

文章目录 概述操作系统层面调优文件系统优化内存管理磁盘 I/O 优化 JVM 调优堆内存设置GC 收集器选择常见 GC 问题 Broker 端调优版本兼容性关键参数配置日志段大小调优设置原则推荐配置调优考虑因素监控命令 应用层调优客户端复用资源管理多线程消费模式 性能指标调优吞吐量优…

佰力博科技与您探讨低温真空探针台如何保养

低温真空探针台是一种用于在低温或真空环境下进行电学性能测试的精密仪器&#xff0c;其保养和维护对于确保设备的稳定运行和延长使用寿命至关重要。 一、日常清洁与检查 1、使用后应立即清洁探针台&#xff0c;尤其是探针、接口和连接器&#xff0c;避免灰尘和杂质影响精度。…

MySQL:深入总结锁机制

写在前面 在 MySQL 数据库中&#xff0c;锁机制是保障并发控制和数据一致性的关键。合理运用锁机制&#xff0c;能有效避免数据竞争&#xff0c;提升数据库性能。接下来&#xff0c;我们就深入了解 MySQL 中的各类锁。 博主总结&#xff08;注&#xff1a;针对总结的详解补充在…

AI+OT安全,让威胁情报实现主动防御

当前&#xff0c;网络犯罪组织的运作模式正日趋“企业化”&#xff0c;给全球网络安全带来了严峻挑战。企业以及各类组织机构有必要采用威胁情报驱动的防御体系&#xff08;Threat-Informed Defense, TID&#xff09;&#xff0c;将安全运营模式从被动响应彻底转向基于威胁情报…