Vue 自定义指令实战

news2024/11/13 15:56:14

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.coloradmin.cn/o/2146817.html

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

相关文章

2024年汉字小达人区级自由报名备考冲刺:今年官方模拟题练一练

2024年第十一届汉字小达人的区级活动的时间9月25-30日正式开赛&#xff0c;还有一周就开始了。 有一些孩子刚刚被老师通知可以参加这个比赛&#xff0c;担心现在准备汉字小达人比赛是否来得及。根据我的经验&#xff0c;精准备考还是有希望的&#xff0c;也可以把这个比赛当做…

视频怎么提取音频?一键音频提取,视频内容轻松听!

视频怎么提取音频&#xff1f;一键解锁音频世界&#xff0c;让视频精彩不再静默&#xff01;无论您是忙碌于日常工作的上班族&#xff0c;还是热衷于学习的求知者&#xff0c;亦或是享受闲暇时光的聆听者&#xff0c;一键提取音频功能让视频内容瞬间转化为耳畔的温柔低语&#…

51单片机——直流电机驱动

1、直流电机介绍 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极&#xff0c;当电极正接时&#xff0c;电机正转&#xff0c;当电极反接时&#xff0c;电机反转。 直流电机主要由永磁体&#xff08;定子&#xff09;、线圈&#xff08;转子&#xff09;和…

Java双端队列ArrayDeque

概述 双端队列ArrayDeque是Java集合框架中的一种数据结构&#xff0c;它实现了Deque接口&#xff0c;因此支持在两端进行添加和移除元素。通过名称也能看出&#xff0c;ArrayDeque是基于数组实现的&#xff0c;ArrayDeque内部使用一个可动态调整大小的环形数组来存储元素。当Ar…

函数递归(上)

目录 1.递归是什么&#xff1f; 1.1 递归的思想&#xff1a; 2.顺序打印⼀个整数的每⼀位 ​编辑3 迭代 4.求第n个斐波那契数 1.递归是什么&#xff1f; 递归其实是⼀种解决问题的⽅法&#xff0c;在C语⾔中&#xff0c;递归就是函数⾃⼰调⽤⾃⼰。 #include <stdio.h…

【JAVA开源】基于Vue和SpringBoot的购物商城网站

本文项目编号 T 032 &#xff0c;文末自助获取源码 \color{red}{T032&#xff0c;文末自助获取源码} T032&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

鸿蒙OpenHarmony【轻量系统芯片移植案例】标准系统方案之扬帆移植案例

标准系统方案之扬帆移植案例 ​ 本文章是基于瑞芯微RK3399芯片的yangfan开发板&#xff0c;进行标准系统相关功能的移植&#xff0c;主要包括产品配置添加&#xff0c;内核启动、升级&#xff0c;音频ADM化&#xff0c;Camera&#xff0c;TP&#xff0c;LCD&#xff0c;WIFI&a…

高效财税自动化软件如何提升企业财务工作的效率与准确性

在当今企业运营中&#xff0c;财务管理发挥着核心作用。它不仅涉及企业正常运转和市场决策&#xff0c;还是推动企业向高质量发展迈进的关键动力。面对激烈的市场竞争与科技革新的双重挑战&#xff0c;财务管理亟需进行持续的转型与提升&#xff0c;为企业高质量发展目标的实现…

vue2.0+ts注册全局函数和几个递归查找

vue2.0ts注册全局函数和几个递归查找 一、main.ts 一、main.ts // 定义你的全局函数,判断是否有按钮权限 interface Item {label: string;checked: number;[k: string]: any; } // 获取按钮时候权限 function globalLable(arr: Item[], label: string): boolean {for (const i…

为大模型提供服务需要多少 GPU 显存?

在几乎所有的 LLM 面试中&#xff0c;有一个问题总是会被提及&#xff1a;“为大模型提供服务需要多少 GPU 显存&#xff1f;” 这不仅仅是一个随机的问题——它是一个关键指标&#xff0c;反映了你对这些强大模型在生产环境中部署和可扩展性的理解程度。 当你使用 GPT、LLaM…

在QSciscintilla编辑器源码中新增关键词分组的方法

由于项目需要&#xff0c;得在QSciscintilla的底层源码中增加几组关键词分组。在网上找了很久&#xff0c;一般都是说利用重写keywords(int set)接口的方式来增加&#xff0c;但这种方法不适用于我的应用场景。因为这种方法只能增加有限个关键词&#xff0c;且都是直接写死的方…

风电出海内幕:黄金期和内卷期共存

间歇性停战&#xff0c;持续性内卷&#xff0c;这就是中国风电。 9月4日&#xff0c;中国可再生能源学会风能专业委员会秘书长秦海岩发布文章《穿越周期&#xff0c;跨过险阻&#xff0c;中国风电的征途仍是星辰大海》。文章指出&#xff0c;中国风电行业正在重现十多年前的恶…

高中数学:立体几何-空间中点、直线、平面之间的位置关系

文章目录 1、空间中直线与直线的位置关系1、平行线传递性质2、定理3、空间直线夹角 2、空间中直线与平面的位置关系1、线面平行2、线面垂直 3、空间中平面与平面的位置关系1、面面平行2、二面角&#xff08;面与面的夹角&#xff09;3、面面垂直 4、补充 1、空间中直线与直线的…

新手也能快速上手!推荐这四款剪辑软件

在数字媒体日益盛行的今天&#xff0c;视频剪辑软件几乎成为了每一位视频创作者或媒体工作者必备的“十八般武艺”之一&#xff1b;用各种软件对影片、音乐进行精确到秒的剪切和调色&#xff0c;让我深刻体验到其功能的强大与方便&#xff0c;下面就为大家分享一下我在工作中常…

制造企业MES系统委外工单管理探析

一、委外工单管理的重要性 在制造企业的生产过程中&#xff0c;委外工单管理是一项重要且复杂的任务。委外加工是指企业将某些生产任务外包给外部供应商完成&#xff0c;以降低成本、提高效率或满足特定需求。然而&#xff0c;委外加工过程中往往存在诸多不确定性&#xff0c;…

【深度学习】(3)--损失函数

文章目录 损失函数一、L1Loss损失函数1. 定义2. 优缺点3. 应用 二、NLLLoss损失函数1. 定义与原理2. 优点与注意3. 应用 三、MSELoss损失函数1. 定义与原理2. 优点与注意3. 应用 四、BCELoss损失函数1. 定义与原理2. 优点与注意3. 应用 五、CrossEntropyLoss损失函数1. 定义与原…

C++(Qt)软件调试---断点高级用法(20)

C(Qt)软件调试—断点高级用法&#xff08;20&#xff09; 文章目录 C(Qt)软件调试---断点高级用法&#xff08;20&#xff09;[toc]1、概述2、断点高级用法1.1 条件断点1.2 日志断点/记录点/消息追踪点1.3 函数断点1.4 命中次数断点1.5 异常断点1.6 等待断点/触发断点1.7 临时断…

一台 Linux 同时 安装配置多个 python3 环境( 3.7 - 3.12 )

很多粉丝来信说&#xff1a;安装新 python3 环境&#xff0c;要卸载操作系统原来自带的 python。。。 博主再次声明&#xff1a;不需用搞复杂了&#xff0c;相反可以同时具备多个环境&#xff0c;也不需用配置环境变量 无图无真相&#xff0c;且看此图&#xff1a; 详情操作&am…

Android IME输入法启动显示隐藏流程梳理

阅读Android AOSP 12版本代码&#xff0c;对输入法IME整体框架模块进行学习梳理&#xff0c;内容包含输入法框架三部分IMM、IMMS、IMS的启动流程、点击弹出流程、显示/隐藏流程&#xff0c;以及常见问题和调试技巧。 1. IME整体框架​​​​​​​ IME整体分为三个部分&#xf…

python怎么打开文件对话框

可以使用tkinter.filedialog模块中的askopenfilename函数来实现&#xff0c;tkinter是python自带的GUI&#xff0c;通过askopenfilename函数打开选择文件对话框&#xff0c;代码如下&#xff1a; import tkinter.filedialog fntkinter.filedialog.askopenfilename(title选择一个…