Vue2 与 Vue3 自定义指令详解:钩子变化、迁移指南与实战示例
Vue2 与 Vue3 自定义指令详解钩子变化、迁移指南与实战示例 自定义指令Custom Directives是对底层 DOM 进行底层操作的能力封装。当组件 / 组合式 API 解决不了「直接操作 DOM」这类需求时如自动聚焦、权限控制、点击外部关闭、文本粘贴格式化等指令是最自然的落点。 前言很多同学用 Vue 写业务时习惯了v-model、v-show、v-if却很少自己写自定义指令。一旦遇到「要在元素插入 DOM 后自动聚焦」「点击组件外部关闭弹层」「按权限动态隐藏元素」这类需求才会意识到指令的价值。本文用一张差异表 多个可运行示例把 Vue2 与 Vue3 的自定义指令讲透并给出从 Vue2 平滑迁移到 Vue3 的实战要点。建议收藏。一、什么是自定义指令指令本质上是「带v-前缀的可复用 DOM 行为」。Vue 内置了v-model、v-show、v-if等当内置指令不够用时可以注册自己的指令。一个指令对象包含若干「钩子函数」Vue 在元素的不同生命周期阶段回调它们。使用方式input v-focus /div v-permissionadmin/p v-highlightyellow高亮文本/p二、Vue2 自定义指令2.1 钩子函数Hook FunctionsVue2 指令对象可包含以下 5 个钩子钩子调用时机bind指令第一次绑定到元素时调用只调用一次。此时 DOM 还未插入父节点无法获取parentNode。inserted被绑定元素插入父节点时调用仅保证父节点存在不保证已在document中。update所在组件的 VNode 更新时调用可能发生在其子 VNode 更新之前。指令的值可能改变也可能没变。componentUpdated指令所在组件的 VNode 及其子 VNode 全部更新后调用。unbind指令与元素解绑时调用只调用一次。2.2 钩子参数每个钩子接收相同的 4 个参数el指令绑定的真实 DOM 元素可直接操作。binding一个对象包含以下属性name指令名不含v-前缀。value指令的绑定值例如v-my-dir1 1中value为2。oldValue上一次的值仅在update/componentUpdated中可用。expression字符串形式的绑定表达式如1 1。arg传给指令的参数如v-my-dir:foo中arg为foo。modifiers修饰符对象如v-my-dir.a.b中modifiers为{ a: true, b: true }。vnodeVue 编译生成的虚拟节点。oldVnode上一个虚拟节点仅在update/componentUpdated中可用。⚠️ 除el外其他参数都应是只读的不要修改它们。2.3 Vue2 注册方式全局注册// main.js Vue.directive(focus,{inserted(el){el.focus();}});局部注册exportdefault{directives:{focus:{inserted(el){el.focus();}}}};2.4 Vue2 完整示例示例 1自动聚焦Vue.directive(focus,{// 元素插入 DOM 后聚焦bind 阶段 el 还没进文档所以用 inserted inserted(el){el.focus();}});示例 2权限控制函数简写形式如果指令在bind和update时触发相同行为可传入函数代替对象Vue.directive(permission,function(el, binding){const userRolestore.getters.role;// 假设从全局状态读取 const requiredbinding.value;// 指令绑定值如adminif(!required.includes(userRole)){el.parentNodeel.parentNode.removeChild(el);}});函数写法等价于在bind和update中调用同一个函数。示例 3动态参数 修饰符拖拽div v-drag:horizontal.throttleonDrag拖我/divVue.directive(drag,{bind(el, binding){const onlyXbinding.arghorizontal;const throttlebinding.modifiers.throttle;letstartX0, startY0;const onMove(e){if(onlyX){el.style.lefte.clientX - startX px;}else{el.style.lefte.clientX - startX px;el.style.tope.clientY - startY px;}};const onDown(e){startXe.clientX - el.offsetLeft;startYe.clientY - el.offsetTop;document.addEventListener(mousemove, onMove);};const onUp()document.removeEventListener(mousemove, onMove);el.addEventListener(mousedown, onDown);el.addEventListener(mouseup, onUp);// 注意真实场景应在 unbind 中清理事件监听避免内存泄漏}});三、Vue3 自定义指令3.1 钩子函数变化重大差异Vue3 重命名并调整了指令钩子与组件生命周期对齐Vue2 钩子Vue3 钩子说明bindbeforeMount指令绑定到元素但还没挂载到 DOM。insertedmounted元素被插入父 DOM 后调用。—beforeUpdate新增元素自身 VNode 更新前Vue2 没有对应独立钩子。update—移除被beforeUpdateupdated取代语义更清晰。componentUpdatedupdated组件及子组件 VNode 全部更新后。unbindunmounted指令与元素解绑、元素卸载时调用。关键点Vue3 的mounted≈ Vue2 的insertedVue3 的beforeMount≈ Vue2 的bind。移植旧指令时最常用的替换就是这两对。3.2 钩子参数Vue3 的钩子同样接收 4 个参数但binding结构略有调整elDOM 元素同 Vue2。binding包含instance新增使用指令的组件实例、value、oldValue、arg、modifiers、dir指令定义对象自身。vnode虚拟节点。prevVnode上一个虚拟节点updated中可用替代 Vue2 的oldVnode。✅ Vue3 在binding中暴露了instance组件实例和dir指令对象便于在钩子间共享状态。3.3 Vue3 注册方式全局注册使用app实例// main.jsimport{createApp}fromvue;importApp from./App.vue;const appcreateApp(App);app.directive(focus,{mounted(el){el.focus();}});app.mount(#app);局部注册script setup Composition APIscript setupconst vFocus{mounted:(el)el.focus()};/scripttemplateinput v-focus //template在script setup中指令名必须以v开头的小驼峰变量名声明如vFocus对应v-focus。对象写法简写函数形式等价于mountedupdatedapp.directive(color,(el, binding){el.style.colorbinding.value;});3.4 Vue3 完整示例示例 1自动聚焦app.directive(focus,{mounted(el){el.focus();}});示例 2点击外部关闭Click Outsideapp.directive(click-outside,{mounted(el, binding){// 在 mounted 注册监听binding.value 为回调函数 el.__clickOutside__(event){if(!(elevent.target||el.contains(event.target))){binding.value(event);}};document.addEventListener(click, el.__clickOutside__,true);}, unmounted(el){document.removeEventListener(click, el.__clickOutside__,true);delete el.__clickOutside__;}});templatediv v-click-outsidecloseMenuclassmenu菜单内容/div/template示例 3利用binding.instance读取组件状态app.directive(role,{mounted(el, binding){const vmbinding.instance;// 当前组件实例 const userRolevm.userRole;// 直接读组件响应式数据if(!binding.value.includes(userRole)){el.style.displaynone;}}, updated(el, binding){const vmbinding.instance;el.style.displaybinding.value.includes(vm.userRole)?:none;}});四、Vue2 ↔ Vue3 核心差异速查对比项Vue2Vue3全局注册 APIVue.directive()app.directive()需createApp实例钩子bind✅改名beforeMount钩子inserted✅改名mounted钩子update✅移除拆为beforeUpdateupdated钩子componentUpdated✅改名updated钩子unbind✅改名unmounted新增beforeUpdate❌✅binding.instance❌✅可访问组件实例binding.dir❌✅可访问指令对象自身script setup局部指令不支持无此语法支持vXxx变量命名oldVnode→prevVnodeoldVnodeprevVnode五、迁移要点Vue2 → Vue3钩子改名bind→beforeMount、inserted→mounted、componentUpdated→updated、unbind→unmounted。拆分update若原update里依赖「子节点已就绪」迁移后应放到updated若依赖「自身更新前」用beforeUpdate。清理逻辑把事件监听、定时器、观察者等的清理统一放到unmounted原unbind。binding.instance替代 hackVue2 常通过vnode.context拿组件实例Vue3 直接用binding.instance更干净。TypeScript 类型Vue3 提供DirectiveBinding、Directive等类型推荐声明importtype{Directive, DirectiveBinding}fromvue;const vFocus: DirectiveHTMLElement, void{mounted(el){el.focus();}};六、最佳实践✅能用组件 / 组合式函数解决的优先不用指令。指令是「最后手段」因为直接操作 DOM 会绕过 Vue 的响应式系统。✅务必在unmounted/unbind中清理副作用事件监听、ResizeObserver、定时器、IntersectionObserver等否则内存泄漏。✅不要在指令里修改binding对象它是只读快照。✅ 复杂指令可用binding.dir存共享状态或把状态挂在el.__xxx__上注意命名冲突建议加前缀。✅ 指令值尽量传「函数 / 对象」而非命令式字符串便于类型推导与测试。七、小结自定义指令 封装底层 DOM 行为的复用单元。Vue3 把指令钩子对齐组件生命周期全部带Mount语义并新增beforeUpdate、暴露binding.instance。迁移核心就是四个钩子改名 update拆分 清理逻辑归位。指令应作为「直接操作 DOM」场景的兜底方案注意副作用清理。如果这篇文章帮你理清了 Vue 指令的迁移思路欢迎点赞 ❤️、收藏 ⭐、关注 并在评论区聊聊你在项目中用指令解决过什么奇葩需求本文同步整理自个人知识库更多 Vue 进阶笔记持续更新中。

相关新闻

Kimi K3 技术拆解:2.8万亿参数开源模型背后的KDA+AttnRes架构创新

Kimi K3 技术拆解:2.8万亿参数开源模型背后的KDA+AttnRes架构创新

写在前面 2026年7月16日,月之暗面在WAIC开幕前夜发布Kimi K3——2.8万亿参数、全球最大开源模型,Frontend Code Arena编程榜1679分登顶世界第一。本文从工程和技术角度拆解它的架构设计。一、架构总览:MoE KDA AttnRes配置项数值总参数2.8万…

2026/7/18 20:52:25阅读更多 →
2026市政绿化杆直销怎么选?看准这三点不踩坑

2026市政绿化杆直销怎么选?看准这三点不踩坑

随着新型城镇化与生态修复工程持续推进,市政绿化、河道治理、园林景观等领域对杉木桩的需求持续走高。进入2026年,市场上的杉木桩产品品类愈发丰富,但质量参差不齐的问题依然存在。面对直销模式下价格战与宣传话术漫天飞的现状,采…

2026/7/18 20:52:25阅读更多 →
从源头工厂的视角,拆解车用 CNG 改装套件的安全性与技术壁垒

从源头工厂的视角,拆解车用 CNG 改装套件的安全性与技术壁垒

引言在当今倡导绿色低碳与能效优化的背景下,多能源混合及燃油替代技术在交通运输领域得到了广泛应用。其中,CNG(压缩天然气)汽车改装技术作为一种经济、环保的成熟方案,在出租车、网约车及物流运输车辆中占据了重要地位…

2026/7/18 20:52:25阅读更多 →
【AI数字人动作捕捉实战指南】:零基础到商用级精度的7步落地法

【AI数字人动作捕捉实战指南】:零基础到商用级精度的7步落地法

更多请点击: https://codechina.net 第一章:AI数字人动作捕捉的技术演进与商用价值 AI数字人动作捕捉已从早期依赖高精度光学标记点的实验室方案,演进为融合多模态感知、端侧轻量化推理与生成式建模的工业级技术栈。其核心驱动力在于传感器成…

2026/7/18 22:04:50阅读更多 →
不同算力下 AI 视频生成效果对比:RTX4090 vs A100 实测差距有多大

不同算力下 AI 视频生成效果对比:RTX4090 vs A100 实测差距有多大

一、测评基准与硬件参数说明1.1 统一测试环境测试周期:2026 年 7 月 10 日 - 7 月 16 日 系统统一配置:Ubuntu22.04、CUDA12.8、PyTorch2.8、FlashAttention3、xFormers 加速 标准化生成参数:10s 时长、24fps、采样步数 72、CFG8,…

2026/7/18 22:04:50阅读更多 →
Genome Biology项目文章 | 山东大学董家强团队揭示玉米EMF2b-1通过PRC2招募调控胚乳细胞周期的分子机制

Genome Biology项目文章 | 山东大学董家强团队揭示玉米EMF2b-1通过PRC2招募调控胚乳细胞周期的分子机制

玉米胚乳是人类粮食和畜牧业饲料的主要营养来源,也是众多工业产品的原料基础。胚乳发育经历合胞体形成、细胞化、有丝分裂、细胞分化、核内复制(endoreduplication)和成熟等多个精确调控的阶段。其中,有丝分裂决定了胚乳细胞的数量…

2026/7/18 22:04:50阅读更多 →
FastAPI 生产环境避坑指南:用 Alembic 管理数据库迁移,别再手动改表结构了!

FastAPI 生产环境避坑指南:用 Alembic 管理数据库迁移,别再手动改表结构了!

😭 第一幕:那些年,我们一起手动执行的 SQL我相信很多朋友在项目初期或者一些小项目里,都干过这样的事儿:本地开发改了 Model,然后把改表的 SQL 语句保存到一个 txt 或者 sql 文件里。上线的时候&#xff0c…

2026/7/18 22:04:50阅读更多 →
国内当下AI发展的水平与程序员如何应对AI时代

国内当下AI发展的水平与程序员如何应对AI时代

国内当下AI发展的水平与程序员如何应对AI时代引言:AI已经成为新一轮科技竞争的核心近年来,人工智能已成为全球科技竞争的重要领域。随着大模型、生成式AI、智能机器人等技术不断突破,AI正深刻影响着软件开发、制造、医疗、教育、金融等多个行…

2026/7/18 22:04:50阅读更多 →
如何快速掌握RVC变声器:从新手到专家的完整语音克隆指南

如何快速掌握RVC变声器:从新手到专家的完整语音克隆指南

如何快速掌握RVC变声器&#xff1a;从新手到专家的完整语音克隆指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conve…

2026/7/18 22:02:49阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比&#xff1a;全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时&#xff0c;第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/18 10:49:13阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件&#xff1a;5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/18 8:49:08阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL&#xff1a;跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/18 14:49:24阅读更多 →
从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;从模糊意图到可执行指令&#xff1a;Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档&#xff08;PRD&#xff09;生成实践中&#xff0c;原始业务意图往往以自然语言片…

2026/7/18 0:00:14阅读更多 →
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Cursor配置生成失效&#xff1f;3大隐藏陷阱4行修复代码&#xff0c;资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效&#xff0c;是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

2026/7/18 0:00:14阅读更多 →
某智驾大牛创业

某智驾大牛创业

作者&#xff1a;钟声编辑&#xff1a;Mark出品&#xff1a;红色星际头图&#xff1a;智能驾驶图片据悉&#xff0c;国内某头部智驾公司端到端模型技术大牛Z投身创业&#xff0c;并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈&#xff0c;更是业内…

2026/7/18 0:00:14阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/17 22:48:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/18 18:49:35阅读更多 →