Vue内置指令与自定义指令

一、前言

在 Vue 开发中,指令(Directives) 是一种非常强大的特性,它允许我们以声明式的方式操作 DOM。Vue 提供了一些常用的内置指令,如 v-ifv-showv-bindv-on 等,同时也支持开发者根据需求创建自己的自定义指令

本文将带你全面了解 Vue 中的指令系统,包括:

  • 常用内置指令的使用
  • 自定义指令的定义与注册
  • 指令的生命周期钩子函数
  • 实际应用场景与案例分析

二、Vue 内置指令介绍

1. 条件渲染指令

  • v-if:根据表达式的真假决定是否渲染元素。
  • v-else / v-else-if:配合 v-if 使用,实现多条件判断。
  • v-show:通过 CSS 的 display 属性控制元素显示/隐藏。
<h1 v-if="isLoggedIn">欢迎回来!</h1>
<h1 v-else>请先登录。</h1>

2. 列表渲染指令

  • v-for:用于循环渲染列表数据。
<ul><li v-for="(item, index) in items" :key="index">{{ item }}</li>
</ul>

3. 数据绑定指令

  • v-bind:动态绑定属性值,常用缩写为 :attr="value"
<img :src="imageUrl" alt="图片">
<a :href="linkUrl">点击我</a>
  • v-model:实现表单控件与组件状态的双向绑定。
<input type="text" v-model="username">
<p>你输入的用户名是:{{ username }}</p>

4. 事件绑定指令

  • v-on:监听 DOM 事件并执行对应的方法,常用缩写为 @event="handler"
<button @click="submitForm">提交</button>
<input @keyup.enter="search" placeholder="按回车搜索">

5. 其他常用指令

  • v-text:更新元素的文本内容,会覆盖已有内容。
  • v-html:插入 HTML 字符串(注意 XSS 风险)。
  • v-pre:跳过编译过程,直接显示原始内容。
  • v-once:只渲染一次,后续不再更新。

三、自定义指令的使用

虽然 Vue 提供了很多实用的内置指令,但有时我们需要一些特定功能来操作 DOM 或增强组件行为,这时就可以使用自定义指令

1. 定义一个自定义指令

Vue 2.x 示例:
// main.js
Vue.directive('highlight', {bind(el, binding, vnode) {el.style.backgroundColor = binding.value;}
});
Vue 3 Composition API 示例:
// main.js
const app = createApp(App)app.directive('highlight', {beforeMount(el, binding) {el.style.backgroundColor = binding.value;}
})app.mount('#app')

2. 在模板中使用

<p v-highlight="'yellow'">这段文字会被高亮显示</p>

3. 指令的参数说明

每个指令都有一个回调对象,包含以下属性:

属性名描述
el当前绑定的 DOM 元素
binding包含指令的所有信息的对象,如 valueoldValueargmodifiers 等
vnode虚拟节点
prevNode之前的虚拟节点(Vue 3)

四、指令的生命周期钩子函数(Vue 3)

在 Vue 3 中,自定义指令有如下可用的钩子函数:

钩子函数触发时机
beforeMount指令第一次绑定到元素时调用(之前叫 bind
mounted元素被插入到父节点时调用(之前叫 inserted
beforeUpdate所在组件即将更新时调用(之前叫 update
updated所在组件更新后调用(之前叫 componentUpdated
beforeUnmount元素即将解绑时调用(之前叫 unbind
unmounted元素已解绑时调用

五、实战应用:创建几个实用的自定义指令

✅ 指令一:自动聚焦指令 v-focus

适用于页面加载或弹窗打开时自动聚焦某个输入框。

app.directive('focus', {mounted(el) {el.focus()}
})

使用:

<input v-focus placeholder="自动获取焦点">

✅ 指令二:权限控制指令 v-permission

可用于根据用户角色控制某些按钮或菜单的显示。

app.directive('permission', {mounted(el, binding) {const userRoles = ['admin', 'editor'];if (!userRoles.includes(binding.value)) {el.parentNode.removeChild(el); // 移除无权限的元素}}
})

使用:

<button v-permission="'admin'">管理员操作</button>

✅ 指令三:节流防抖指令 v-throttle / v-debounce

防止高频触发事件(如滚动、输入等),提升性能。

app.directive('throttle', {mounted(el, binding) {let timer = null;el.addEventListener('scroll', () => {if (!timer) {binding.value(); // 执行传入的方法timer = setTimeout(() => timer = null, 300);}});}
});

使用:

<div v-throttle="onScroll">滚动区域</div>

六、最佳实践与注意事项

场景推荐做法
不要滥用指令优先使用组件化、响应式数据处理逻辑
尽量避免直接操作 DOMVue 的核心思想是数据驱动视图
指令应保持轻量复杂逻辑建议封装成方法或组件
注意内存泄漏在 unmounted 钩子中清理定时器、事件监听等资源
Vue 3 中替代过滤器可结合指令 + 方法进行格式化输出

七、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

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

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

相关文章

华为AP6050DN无线接入点瘦模式转胖模式

引言 华为AP6050DN是一款企业级商用的无线接入点。由于产品定位原因,其默认工作在瘦模式下,即须经AC统一控制和管理,是不能直接充当普通的无线路由器来使用的。 而本文的目的,就是让其能脱离AC的统一控制和管理,当作普通无线路由器来使用。 硬件准备 华为AP6050DN无线接…

程序员出海之英语-使用手册

为什么现在实时翻译工具这么牛逼了&#xff0c;AI转译这么准确了&#xff0c;我还在这里跟老古董一样吭哧吭哧学英语呢&#xff1f; 这是因为我们始终是和人打交道&#xff0c;不仅仅是为了考试&#xff0c;看懂官方文章&#xff0c;听懂官方视频。这里为什么说官方&#xff0c…

Java 事务管理:在分布式系统中实现可靠的数据一致性

Java 事务管理&#xff1a;在分布式系统中实现可靠的数据一致性 在当今的软件开发领域&#xff0c;分布式系统逐渐成为主流架构。然而&#xff0c;这也给事务管理带来了巨大的挑战。本文将深入探讨 Java 事务管理在分布式系统中的关键要点&#xff0c;并通过详细代码实例展示如…

微信小程序关于截图、录屏拦截

1.安卓 安卓&#xff1a; 在需要禁止的页面添加 onShow() {if (wx.setVisualEffectOnCapture) {wx.setVisualEffectOnCapture({visualEffect: hidden,complete: function(res) {}})}},// 页面隐藏和销毁时需要释放防截屏录屏设置onHide() {if (wx.setVisualEffectOnCapture) {w…

使用 PySpark 从 Kafka 读取数据流并处理为表

使用 PySpark 从 Kafka 读取数据流并处理为表 下面是一个完整的指南&#xff0c;展示如何通过 PySpark 从 Kafka 消费数据流&#xff0c;并将其处理为可以执行 SQL 查询的表。 1. 环境准备 确保已安装: Apache Spark (包含Spark SQL和Spark Streaming)KafkaPySpark对应的Ka…

第十天的尝试

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 哈哈&#xff0c;十天缺了两天&#xff0c;我写的文章现在质量不高&#xff0c;所以我可能考虑&#xff0c;应该一星期或者三四天出点高质量的文章&#xff0c;同时很开心大家能够学到知识&a…

mediapipe标注视频姿态关键点(基础版加进阶版)

前言 手语视频流的识别有两种大的分类&#xff0c;一种是直接将视频输入进网络&#xff0c;一种是识别了关键点之后再进入网络。所以这篇文章我就要来讲讲如何用mediapipe对手语视频进行关键点标注。 代码 需要直接使用代码的&#xff0c;我就放这里了。环境自己配置一下吧&…

Redis数据迁移方案及持久化机制详解

#作者&#xff1a;任少近 文章目录 前言Redis的持久化机制RDBAOF Redis save和bgsave的区别redis数据迁移redis单机-单机数据迁移redis 主从-主从数据迁移redis 单机-cluster数据迁移redis cluster –redis cluster数据迁移 前言 Redis数据迁移是常见需求&#xff0c;主要包括…

图论回溯

图论 200.岛屿数量DFS 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外&#xff…

真实网络项目中交换机常用的配置与解析

一、配置三层链路聚合增加链路带宽 1.组网需求 某企业有多个部门分布在不同的地区&#xff0c;由于业务发展的需要&#xff0c;不同区域的部门与部门之间有进行带有VLAN Tag的报文的传输需求。采用透明网桥的远程桥接和QinQ功能&#xff0c;可以实现企业在不同区域部门之间进…

【Redis】过期键删除策略,LRU和LFU在redis中的实现,缓存与数据库双写一致性问题,go案例

一、Redis 中的过期键删除策略有哪些&#xff1f; 采用了 惰性删除 和 定期删除 两种策略处理过期键&#xff1a; 1. 惰性删除&#xff08;Lazy Deletion&#xff09; 机制&#xff1a;只有在访问 key 时才检查是否过期&#xff0c;如果已过期则立刻删除。优点&#xff1a;对…

为什么单张表索引数量建议控制在 6 个以内

单张表索引数量建议控制在6个以内的主要原因包括以下几点‌&#xff1a; ‌性能影响‌&#xff1a;索引会占用额外的磁盘空间。如果索引数量过多&#xff0c;会占用大量的磁盘空间&#xff0c;尤其是在数据量较大的情况下&#xff0c;索引占用的空间可能会超过数据本身。此外&…

深度学习实战109-智能医疗随访与健康管理系统:基于Qwen3(32B)、LangChain框架、MCP协议和RAG技术研发

大家好,我是微学AI,今天给大家介绍一下深度学习实战109-智能医疗随访与健康管理系统:基于Qwen3(32B)、LangChain框架、MCP协议和RAG技术研发。在当今医疗信息化快速发展的背景下,医疗随访与健康管理面临着数据分散、信息整合困难、个性化方案生成效率低等挑战。传统的医疗随…

聊一聊 .NET Dump 中的 Linux信号机制

一&#xff1a;背景 1. 讲故事 当 .NET程序 在Linux上崩溃时&#xff0c;我们可以配置一些参考拿到对应程序的core文件&#xff0c;拿到core文件后用windbg打开&#xff0c;往往会看到这样的一句信息 Signal SIGABRT code SI_USER (Sent by kill, sigsend, raise)&#xff0c…

如何在uniapp H5中实现路由守卫

目录 Vue3 app.config.globalProperties 1. 创建 Vue 应用实例 2. 添加全局属性或方法 3. 在组件中使用全局属性或方法 beforeEach在uniapp的注册 1、在H5中这两个对象是都存在的。「router:route」但是功能并不全面,具体可参考下图。 2、刚刚测试了一下,在微信小程序…

无人机降落伞设计要点难点及原理!

一、设计要点 1. 伞体结构与折叠方式 伞体需采用轻量化且高强度的材料&#xff08;如抗撕裂尼龙或芳纶纤维&#xff09;&#xff0c;并通过多重折叠设计&#xff08;如三重折叠缝合&#xff09;减少展开时的阻力&#xff0c;同时增强局部承力区域的强度。 伞衣的几何参数&am…

AI时代新词-AI增强现实(AI - Enhanced Reality)

一、什么是AI增强现实&#xff08;AI - Enhanced Reality&#xff09;&#xff1f; AI增强现实&#xff08;AI - Enhanced Reality&#xff09;是指将人工智能&#xff08;AI&#xff09;技术与增强现实&#xff08;Augmented Reality&#xff0c;简称AR&#xff09;技术相结合…

基于Matlab实现各种光谱数据预处理

在IT领域&#xff0c;尤其是在数据分析和科学研究中&#xff0c;光谱数据的预处理是至关重要的步骤。光谱数据通常包含了丰富的信息&#xff0c;但往往受到噪声、杂散光、背景信号等因素的影响&#xff0c;需要通过预处理来提取有效信号&#xff0c;提高分析的准确性和可靠性。…

用 commitizen-go 来实现标准化你的Git提交信息 【windows 版】

前言 团队中有部分人的 commit 信息比较随意&#xff0c;因此想用工具来进行约束&#xff0c; web 项目可以使用 commitizen 来实现&#xff0c; 但是 golang 又该用什么来约束呢&#xff0c; 在 Github 上找到 commitizen-go 可以做为 commitizen 平替&#xff0c;但该说明文…

为什么共现矩阵是高维稀疏的

为什么共现矩阵是高维稀疏的&#xff1f; 共现矩阵&#xff08;Co-occurrence Matrix&#xff09;的高维稀疏性是其固有特性&#xff0c;主要由以下原因导致&#xff1a; 1. 高维性的根本原因 词汇表大小决定维度&#xff1a; 共现矩阵的维度为 ( V \times V )&#xff0c;其…