Vue 3.0 自定义指令
创始人
2025-05-29 22:58:31

#概览

下面是对变更的简要总结:

  • API 已重命名,以便更好地与组件生命周期保持一致
  • 自定义指令将由子组件通过 v-bind="$attrs"

更多信息,请继续阅读!

#2.x 语法

在 Vue 2,自定义指令是通过使用下面列出的钩子来创建的,这些钩子都是可选的

  • bind - 指令绑定到元素后发生。只发生一次。
  • inserted - 元素插入父 DOM 后发生。
  • update - 当元素更新,但子元素尚未更新时,将调用此钩子。
  • componentUpdated - 一旦组件和子级被更新,就会调用这个钩子。
  • unbind - 一旦指令被移除,就会调用这个钩子。也只调用一次。

下面是一个例子:

 
  1. 高亮显示此文本亮黄色

 
  1. Vue.directive('highlight', {
  2. bind(el, binding, vnode) {
  3. el.style.background = binding.value
  4. }
  5. })

在这里,在这个元素的初始设置中,指令通过传递一个值来绑定样式,该值可以通过应用程序更新为不同的值。

#3.x 语法

然而,在 Vue 3 中,我们为自定义指令创建了一个更具凝聚力的 API。正如你所看到的,它们与我们的组件生命周期方法有很大的不同,即使我们正与类似的事件钩子,我们现在把它们统一起来了:

  • bind → beforeMount
  • inserted → mounted
  • beforeUpdate:新的!这是在元素本身更新之前调用的,很像组件生命周期钩子。
  • update → 移除!有太多的相似之处要更新,所以这是多余的,请改用 updated
  • componentUpdated → updated
  • beforeUnmount:新的!与组件生命周期钩子类似,它将在卸载元素之前调用。
  • unbind -> unmounted

最终 API 如下:

 
  1. const MyDirective = {
  2. beforeMount(el, binding, vnode, prevVnode) {},
  3. mounted() {},
  4. beforeUpdate() {},
  5. updated() {},
  6. beforeUnmount() {}, // 新
  7. unmounted() {}
  8. }

生成的 API 可以这样使用,与前面的示例相同:

 
  1. 高亮显示此文本亮黄色

 
  1. const app = Vue.createApp({})
  2. app.directive('highlight', {
  3. beforeMount(el, binding, vnode) {
  4. el.style.background = binding.value
  5. }
  6. })

既然定制指令生命周期钩子映射了组件本身的那些,那么它们就更容易推理和记住了!

#边界情况:访问组件实例

通常建议保持指令独立于它们所使用的组件实例。从自定义指令中访问实例通常表明该指令本身应该是一个组件。然而,在某些情况下,这实际上是有意义的。

在Vue 2中,必须通过vnode参数访问组件实例:

 
  1. bind(el, binding, vnode) {
  2. const vm = vnode.context
  3. }

在Vue 3中,实例现在是bind的一部分:

 
  1. mounted(el, binding, vnode) {
  2. const vm = binding.instance
  3. }

#实施细节

在 Vue 3 中,我们现在支持片段,这允许我们为每个组件返回多个 DOM 节点。你可以想象,对于具有多个 

  •  的组件或一个表的子元素这样的组件有多方便:

     
    

    如此灵活,我们可能会遇到一个定制指令的问题,它可能有多个根节点。

    因此,自定义指令现在作为虚拟 DOM 节点数据的一部分包含在内。当在组件上使用自定义指令时,钩子作为无关的 prop 传递到组件,并以 this.$attrs 结束。

    这也意味着可以像这样在模板中直接挂接到元素的生命周期中,这在涉及到自定义指令时非常方便:

     
    

    这与属性 fallthrough 行为是一致的,因此,当子组件在内部元素上使用 v-bind="$attrs" 时,它也将应用对其使用的任何自定义指令。

  • 相关内容

    热门资讯

    重磅!2025陆家嘴论坛6月1... 《国际金融报》记者获悉,5月30日,上海市政府举行新闻发布会,上海市委金融办、中国人民银行办公厅、上...
    零基础入门学习Python 0... 目录 1.函数的参数  2.函数文档 3.返回值  4. 局部变量全局变量 5.内嵌函数 6.闭包...
    剧本中的灭世海啸即将到来?特朗... 欢迎来到:自说自话的总裁两周前,94岁的巴菲特在退休直播中说,美元,将「下地狱」,我们不会投资。这句...
    sdbusplus:servi... 有的时候需要在service(记做s1)的method内访问其他serv...
    EEPROM芯片(24c02)... 1、前言 (1)本文主要是通过24c02芯片来讲解I2C接口的EEPROM操作方法,...
    鼓励中长期资金指数化投资!上证... 文/王兆寰2025年5月30日下午,上海证券交易所与中证指数公司公布优化上证380指数编制方案,并发...
    龙虎榜丨机构今日买入这15股,... 盘后数据显示,5月30日龙虎榜中,共33只个股出现了机构的身影,15只股票呈现机构净买入,18只股票...
    年轻人的“茅台”新高不断!重仓... 今年以来,新消费概念股走势强劲。港股的泡泡玛特(国内潮玩行业龙头)今年来新高不断,截至2025年5月...
    履新超130天,荣耀CEO李健... 5月下旬,一系列新品发布浪潮席卷而来。中端智能手机市场本就是国内各大厂商的战略要地,如今竞争再度白热...
    岷山环能IPO:全员被批“学历... 近日,北交所官网显示,岷山环能高科股份公司(以下简称“岷山环能”)IPO提交注册。据悉,岷山环能20...
    【TDengine】一篇文章带... 目录 1、通过docker方式安装 2、相关步骤解释 3、停止运行taos与卸载 1、通过doc...
    华人健康并购狂飙:24倍溢价、... 本报(chinatimes.net.cn)记者于娜 见习记者 赵文娟 北京报道在医药零售行业整体放缓...
    “国产版ChatGPT”文心一... 文章目录前言实验结果一、文学创作问题1 :《三体》的作者是哪里人?问题2:...
    上海试点不动产信托登记,相关税... 继北京之后,上海也开始探索不动产信托财产登记确权新机制。中共上海市委金融委员会办公室、 国家金融监督...
    德邦证券董事会改组后“换帅”,... 德邦证券 视觉中国 资料图德邦证券股份有限公司(下称“德邦证券”)步入国有实控阶段后,同步“换帅”...
    连续盈利后,理想要靠纯电车赚钱... 增程市场进入红海后,覆盖新能源市场中更多品类,以及进入下沉市场是理想汽车下一步重心文|陈亮 蒋雨彤编...
    字节短剧大地震:红果吞并抖音团... 2025年5月29日,抖音集团宣布成立“短剧版权中心”,整合旗下抖音短剧、红果短剧相关BD团队(商务...
    算法基础课 算法基础课 第一章 基础算法(一) 1.快速排序——分治[O(n log...
    通用航空ETF基金今日上市 低... 中证网讯 5月30日,华夏国证通用航空产业ETF(基金简称:通用航空ETF基金,基金代码:15923...
    马斯克放豪言:特斯拉人形机器人... IT之家 5 月 30 日消息,SpaceX 和特斯拉的 CEO 埃隆・马斯克在今日的“Road t...
    iOS_performSele... 看一下以下方法的执行结果: 例1:全局并发队列中执行异步任务 dispa...
    来了!新型浮动费率基金| 一文... 首批新型浮动费率基金,本周开卖!这是公募改革方案发布后率先推出的创新产品,是将基金公司与投资者利益深...
    刷题笔记之十三(有假币、最难的... 目录 1. 求正数数组的最小不可组成和 2. 有假币 3. 继承时先调用父类的构造方法;类中的成员变...
    县城的万达广场,王健林才舍不得... 来源:源Sight记者:王言流动危机下,王健林似乎铁了心要将家底一卖到底。近日,国家市场监管总局披露...
    三度递表终闻锣响 手回集团今日... 南方财经全媒体记者 林汉垚 北京报道三闯港交所终圆梦。5月30日,历经两次递表折戟后,小雨伞保险经纪...
    后“531时代”来袭!隆基绿能... “物竞天择,适者生存。一款产品‘打天下’的时代已经终结,光伏市场已经进化到组件差异化的时代,分布式市...
    英伟达吞下45亿美元“哑巴亏”... 出品 | 虎嗅科技组作者 | 丸都山编辑 | 苗正卿头图 | 视觉中国一份喜忧参半的财报,却罕见地让...
    授之以渔篇-论文目录设置、双边... 文章目录细说风云自定义目录页眉、页码空白页删除缘起 细说风云 因为平日使用WPS比较习惯࿰...
    基于jeecgboot的大屏设...      之前主要是讲了数据源的录入与数据库测试功能,但保存这块没有说,...
    江丰电子,8年狂飙14倍,全国... 2017年6月,江丰电子登陆资本市场,发行价4.64元;截至2025年5月29日,按后复权计算,江丰...