Vue 自定义指令实战

Snipaste_2023-09-17_16-09-04.png

引言

Vue自定义指令是Vue.js框架中强大而灵活的功能之一,它允许开发者根据具体需求创建自定义的指令,以实现更加精细化的交互和数据绑定效果。本文将带你深入探索Vue自定义指令的使用方法、原理和实战,为你打开前端开发的新视野。

我们前面几篇文章已经简单介绍了自定义指令的基础,主要介绍指令的概念和常见的内置指令,帮助你理解指令的作用和使用方法:

本篇文章,我们将深入剖析自定义指令的实现原理,探讨指令的生命周期钩子和参数选项,为你解锁更高级的自定义指令技巧。

通过本篇文章的学习,你将学习到如何创建简单的自定义指令,如何与DOM元素进行交互,以及如何利用指令实现自己想要的效果。我们还将分享一些实用的案例和技巧,帮助你在实际项目中更好地应用自定义指令。

无论你是初学者还是有一定经验的开发者,都能从本文中获得实用的知识和技巧。让我们一起探索Vue自定义指令的奥秘,提升我们的前端开发技能吧!

一. 概述

Vue 自定义指令是 Vue.js 框架提供的一项强大功能,它允许开发者根据自己的需求,定义全局或局部指令,以便在 DOM 元素上添加特定的行为和功能。

自定义指令的主要作用是扩展 Vue.js 框架的能力,以满足特定的业务需求。通过自定义指令,我们可以在不更改组件逻辑的情况下,直接操作 DOM 元素,并与 DOM 元素进行交互。

自定义指令具有广泛的用途和许多优势,通过自定义指令,可以实现更丰富的交互和功能,可以操作 DOM实现数据绑定和交互进行表单验证集成第三方库等,从而优化代码提高复性,并解耦视图和逻辑

二. 基本语法

Vue 自定义指令包括两种方式,全局注册局部注册两种方式:

全局注册自定义指令:

Vue.directive('directiveName', {// Directive options
})

局部注册自定义指令:

directives: {directiveName: {// Directive options}
}

在上述两种注册方式中,directiveName 是自定义指令的名称,可以自定义命名。

下面是一个简单的例子,展示了一个简单的自定义指令,用于改变元素的背景颜色,提前目睹一下自定义指令的风采:

Vue.directive('bg-color', {bind: function (el, binding) {el.style.backgroundColor = binding.value}
})

使用自定义指令:

<div v-bg-color="'red'">Custom directive</div>

image.png

上述示例中,v-bg-color是自定义指令的使用方式,并通过binding.value获取到绑定值,然后将其应用于元素的背景颜色。

通过以上两种注册指令的语法结构,我们可以轻松自定义和使用指令,并根据需要执行相应的 DOM 操作。接下来我们会对自定义指令的生命周期钩子函数进行详细的解读。

三. 生命周期

钩子函数

Vue 自定义指令在使用时可以调用一些特定的生命周期钩子函数,用于在不同的阶段执行相应的操作。以下是 Vue 自定义指令的生命周期钩子函数的顺序:

  1. bind:当指令第一次绑定到元素时调用在这个阶段可以进行一些初始化的设置,比如绑定事件监听器或进行一次性的 DOM 操作。

  2. inserted:在指令所在的元素被插入到父元素时调用。如果指令所在的元素是父元素的唯一子节点,那么它将在父元素进行 DOM 插入操作之后立即调用。

  3. update:在指令所在组件的 VNode 更新时调用,但可能会在子组件的 VNode 更新之前触发。可以在这个阶段根据需要更新绑定元素的属性或执行其他操作。

  4. componentUpdated:在指令所在组件的 VNode 及其子组件的 VNode 均进行了更新后调用。

  5. unbind:在指令从元素上解绑时调用。在这个阶段可以进行一些清理工作,比如解绑事件监听器或删除 DOM 操作。

需要注意的是,insertedupdate 钩子函数的调用顺序可能会在 Vue 的更新周期中会有所不同如果需要处理执行顺序相关的逻辑,可以根据具体需求选择合适的钩子函数进行操作。

以前面的演示示例为例v-bg-color,我们升级一下逻辑,以便于我们更好的观察一下指令的生命周期执行顺序:

  1. 元素初始的背景颜色为红色

  2. 3秒后将背景颜色为蓝色

在此期间可以观察生命周期的钩子函数执行顺序,同时也可以看一下在自定义指令的生命周期的使用:

Vue.directive('directiveName', {bind: function (el, binding) {// 指令绑定时的初始化操作el.style.backgroundColor = binding.value;console.log('bind')},inserted: function (el, binding) {// 元素插入到父元素的操作console.log('inserted')},update: function (el, binding) {// 更新指令绑定元素的操作console.log('update')el.style.backgroundColor = binding.value;},componentUpdated: function (el, binding) {// 组件及其子组件都更新后的操作console.log('componentUpdated')},unbind: function (el, binding) {// 解绑指令时的清理工作console.log('unbind')},
})

0914-1.gif

从日志输出的顺序来看:钩子函数的执行顺序为:bindinserted,如果指令期间在更新的话执行updatecomponentUpdated进行更新,指令解绑时执行unbind,至此指令生命周期完结

通过自定义指令的生命周期钩子函数,你可以在不同的阶段执行相应的操作,以实现一些特定的指令功能和行为。这为你提供了更大的灵活性和控制权。

四. 自定义指令参数

在 Vue 中,自定义指令可以接收多个参数,这些参数可以根据需要来传递和使用。下面介绍一些常用的自定义指令参数:

  1. el:指令所绑定的元素,可以通过操作el来直接改变元素的样式、属性等。

  2. binding:一个对象,包含以下属性:

    • value:传递给指令的值,可以是一个绑定的表达式的结果,也可以是一个值。

    • arg:指令的参数,可以是一个静态值或是一个态绑定的表达式。

    • modifiers:一个包含修饰符的对象,用于递给指令的修饰符,可以通过binding.modifiers来获取。

    • expression:指令的表达式字符串。

  3. vnode:Vue 编译生成的虚拟节点(VNode),可以访问和操作 VNode 的属性和方法。

  4. oldVnode:上一个虚拟节点(仅在updatecomponentUpdated钩子函数中可用),可以用来比较新旧虚拟节点的差异。

  5. arg:指的参数,与binding.arg相同,可以用来传递和接收静态值或动态绑定的表达式。

  6. modifiers:用于传递给指令的修饰符,例如v-directive.modifier1.modifier2,可以binding.modifiers来获取。

在自定义指令的钩子函数中,可以通过函数的参数列表来接收这些参数,以便根据进行处理和使用。

以下是一个示例,展示了在定义指令时如何使用这些参数:

Vue.directive('myDirective', {bind: function (el, binding, vnode, oldVnode) {    // 指令绑定时的操作console.log(binding.value); // 打印传递给指令的值console.log(binding.arg); // 打印指令的参数console.log(binding.modifiers); // 打印指令的饰符el.style.color = 'red'; // 改变绑定元素的颜色},update: function(el, binding, vnode, oldVnode) {// 指令更新时的操作console.log(binding.expression) // 打印指令的表达式字符串console.log(binding.oldValue); // 打印旧的绑定值el.style.fontSize = binding.value + 'px'; // 根据递的值改变绑定元素的字体大小if (binding.modifiers.bold) {el.style.fontWeight = 'bold'; // 如果有修饰符,则设置字体为粗体}}
})

通过传递和使用这些参数,你可以根据需要在自定义指令的钩子函数中进行相应的操作,实现不同的指令功能和行为。

五. 自定义指令实例

示例:自定义一个限制输入只能是数字的指令

要自定义一个限制输入只能是数字的指令,可以通过 Vue 自定义指令的bindupdate生命周期钩子函数来实现。如下所示:

Vue.directive('number-only', {bind: function (el) {el.addEventListener('input', function (event) {// 获取输入框的值let inputValue = event.target.value;// 使用正则表达式判断输入是否为数字let formattedValue = inputValue.replace(/[^\d]/g, '');// 更新输入框的值event.target.value = formattedValue;});},update: function (el) {// 在更新时绑定同样的事件处理程序el.addEventListener('input', function (event) {let inputValue = event.target.value;let formattedValue = inputValue.replace(/[^\d]/g, '');event.target.value = formattedValue;});}
})

bindupdate生命周期钩子函数中,我们通过addEventListener监听输入框的input事件,并在事件处理函数中进行处理。使用正则表达式/[^\d]/g可以将除之外的字符替换为空字符串,从而限制输入只能是数字

使用自定义指令v-number-only可以将该指令应用到相应的输入框上:

<input v-number-only type="text">

这样,输入框中的文本将被限制为数字,非数字将被自动过滤掉。

0914-1.gif

从演示的效果图中可以看出:输入框只能输入数字,如果输入其他的字符,输入框将没有任何显示。是由于我们在代码中会监听用户的输入,将不符合定义规范的字符串统一替换成了空字符串。

总结

Vue 自定义指令的核心知识点主要包括以下几个方面:

  1. 注册指令:使用Vue.directive方法注册指令,并提一个包含钩子函数的对象作为参数。可以全局注册指令,也可以在组件内部注册指令。

  2. 钩子函数:自定义指令可以使用的钩子函数包括bindinsertedupdatecomponentUpdatedunbind。这些钩子函数在指令的不同生命周期中执行相应的逻辑。

  3. 参数传递:可以使用指令的参数传递数据或选。使用.来指定参数,例如v-my-direct:arg.modifier。在钩子函数中,可以通过binding参数访问指令的参数。

  4. 操作元素:可以通过el参数访问指令绑定的元素,可以操作元素的属性、样式、class 等。

  5. 绑定值:可以通过binding.value来获取指令绑定的值,也可以通过binding.oldValue来获取之前绑定值。在钩子函数中,可以根据绑定值的变化执行相应的逻辑。

  6. 更新元素:在钩子函数中,可以通过elbindingnode等参数来更新元素的状态样式或属性。

  7. 释放资源:确保在指令解绑时释放相应资源,避免内存泄漏。在unbind钩子函数中,可以移除事件监听、定时器或其他可能导致资源泄漏的操作。

综上所述,掌握上述核心知识点能够帮助我们更好地理解和使用 Vue 自定义指令,实现各种自定义功能,增强我们的 Vue 应用的灵活性和可复用性。

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

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

相关文章

推荐10款知名的供应链管理系统,为企业选型提供参考!

本文将盘点十款供应链管理系统&#xff0c;为企业选型提供参考&#xff01; 想象一下&#xff0c;一家企业在生产和销售产品的过程中&#xff0c;原材料供应不及时、库存积压严重、物流配送混乱。这时&#xff0c;供应链管理系统就如同一位高效的指挥家&#xff0c;将各个环节紧…

汽车EDI:MöllerTech EDI项目案例

MllerTech &#xff08;以下简称 Mller&#xff09;是一家德国的家族企业&#xff0c;成立于1730年&#xff0c;主要从事塑料和橡胶领域的生产和加工。公司以其在汽车工业、电子设备和机械制造等行业的解决方案而闻名&#xff0c;尤其是在汽车部件、密封件和工业用途的高性能塑…

进程的知识

进程知识 1.进程和程序的区别: 程序是静态的&#xff0c;它是保存在磁盘上的指令的有序集合&#xff0c;没有任何执行的概念进程是一个动态的概念&#xff0c;它是程序执行的过程&#xff0c;包括了动态创建、调度和销毁的整个过程 2.进程的执行方式&#xff1a; 并行执行 :…

彻底解决找不到msvcr100dll,无法继续执行代码的5个方法

MSVCR100.dll文件的丢失可能会引发一系列系统运行和应用程序功能上的问题。作为Microsoft Visual C运行库中的一个关键动态链接库文件&#xff0c;它的缺失会导致依赖于此文件的软件无法正常启动或执行预期功能。具体表现可能包括但不限于&#xff1a;应用程序崩溃、闪退&#…

SAP B1 营销单据 - 单据字段介绍(下)

背景 营销单据&#xff0c;SAP B1 中一群神秘的单据&#xff0c;在官方说明文档中并未指明【营销单据】范围&#xff0c;却经常使用这一说法。它们结构相似&#xff0c;在 用户定义字段(UDF) 功能里统一受【营销单据】部分增加字段的影响&#xff0c;可以相互复制&#xff08;…

企语iFair-协同管理系统-任意文件读取

文章目录 免责申明漏洞描述搜索语法漏洞复现yaml修复建议 免责申明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 企语iFair协同管理系统getuploadimage.jsp接口处存在任意文件读取漏洞…

媒体购买指南:是什么以及如何开始

媒体购买是几乎任何企业都非常重要的一个过程&#xff0c;其中包括付费的网络广告、电视广告、音频广告、户外广告等&#xff0c;这些都是许多多渠道营销策略中的重要组成部分。然而&#xff0c;线上和线下广告远非简单之事&#xff0c;尤其是数字广告&#xff0c;随着各种平台…

LED智慧一体机已成为高端超微小间距COB显示领域的风向标

​LED智慧一体机成为推动智能会议、高效办公与教育创新的强大引擎。本文将深入剖析晶锐创显LED智慧一体机的技术革新、功能集成、应用场景以及其对未来显示技术发展的深远影响。 1、技术革新&#xff1a;COB超高清显示技术的璀璨绽放 LED智慧一体机之所以能在众多显示产品中脱…

深入探究HTTP网络协议栈:互联网通信的基石

在我们日常使用互联网的过程中&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;扮演着至关重要的角色。无论是浏览网页、下载文件&#xff0c;还是进行在线购物&#xff0c;HTTP协议都在背后默默地支持着这些操作。今天&#x…

DNS和ICMP

DNS DNS&#xff08;Domain Name System &#xff09; DNS 是一整套从域名映射到 IP 的系统 关于DNS背景 TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序 . 但是 IP 地址不 方便记忆 . 于是人们发明了一种叫主机名的东西 , 是一个字符串 , 并且…

2024好用的图纸加密软件推荐,10款最好用的cad图纸加密软件排行榜

在工程设计和建筑领域&#xff0c;CAD图纸承载着重要的技术信息和商业机密。因此&#xff0c;保护这些图纸的安全性显得尤为重要。为了帮助您选择合适的图纸加密软件&#xff0c;本文将推荐2024年最好用的10款CAD图纸加密软件&#xff0c;其中包括Ping32。 1. Ping32 Ping32是…

巴西新闻媒体发稿推荐-绍珀洛周报saopauloweekly

全球化浪潮中的巴西机遇 在全球化的进程中&#xff0c;拓展海外市场对于企业的发展至关重要。巴西作为南美洲最大的经济体和人口大国&#xff0c;拥有巨大的商业潜力。大舍传媒凭借其在媒体领域的丰富经验和广泛网络&#xff0c;成功与巴西多家权威媒体展开合作&#xff0c;为企…

执行测试_单元测试

在执行测试为主线&#xff0c;中间穿插质量特性&#xff0c;学会自动化工具的使用。 软件测试的过程 测试范围&#xff1a;逐渐增大&#xff1a;先使用白盒测试&#xff0c;然后黑盒测试的比例逐步增加。测试视角&#xff1a;从代码到使用 具体来说就是&#xff1a; 单元测试—…

性能测试的五大目标

性能测试的目的其实是为了验证软件系统是否能够达到用户的性能指标&#xff0c;发现软件系统中存在的性能瓶颈&#xff0c;随后优化软件&#xff0c;最后起到优化系统的目的。 主要有以下几点&#xff1a; 评估系统的能力 测试中得到的负荷和响应时间数据可以被用于验证所计…

工具方法 - Dropit文件管理工具

Personal Assistant to Automatically Manage Your Files / 自动管理文件的私人助理 之前为了管理电脑上的文件&#xff0c;尝试了一段时间DropIt这个工具。这是一个开源免费软件。使用时&#xff0c;只需将文件拖动到DropIt的浮动图标上&#xff0c;就会自动根据文件类型(文件…

Linux 查看磁盘 df -h 已经查看目录大小 du -sh ./*

使用df -h 命令可以查看磁盘信息 df -h 如下图所示: 获取当前目录 每个目录大小 du -sh ./* du -sh ./* 如果文件比较多 我们想获取文件大小最大的前10个 可以运行如下命令: du -ah | sort -rh | head -n 10 du -ah&#xff1a;显示当前目录及其子目录的所有文件和目录的…

YOLOv8+SAHI,针对小目标检测的切片辅助训练推理,缺陷检测检测精度大幅提升

💡💡💡本文摘要:1)分析了工业缺陷的难点;2)提供了用SAHI方法子图训练,如何自动生成对应xml的代码;3)SAHI+YOLOv8如何推理 原图 切分为子图训练+推理 1.工业缺陷检测介绍 得益于机器视觉的不断发展

Java程序的执行原理

计算机能认识的机器语言 机器语言是由0和1组成&#xff0c;分别代表不通电和通电两种运行状态&#xff08;因为计算机底层都是硬件电路&#xff09;&#xff0c;例如&#xff1a;00011110101001.... 编程语言发展历程 机器语言 汇编语言 高级编程语言-Java、Python、C等 …

16个AI应用技巧,职场提升永远可以相信!

人工智能&#xff08;AI&#xff09;的迅速崛起&#xff0c;已经深刻地改变了多个行业&#xff0c;并将在未来持续塑造我们的职场格局。为了应对这一潮流&#xff0c;职场人士必须主动适应AI带来的技术变革&#xff0c;持续学习新技能&#xff0c;提升自己的专业能力。这篇文章…

C++第二讲:类和对象

C第二讲&#xff1a;类和对象 1.类的定义1.1类定义格式1.2访问限定符1.3类域1.4类定义注意事项 2.实例化2.1什么是实例化2.2对象大小2.3this指针2.4题目练习 3.C语言和C实现Stack对比4.构造函数4.1什么是构造函数4.2构造函数的使用 5.析构函数5.1什么是析构函数5.2析构函数的使…