DOM 操作总重复?1 个自定义指令技巧
ztj100 2025-06-12 19:08 8 浏览 0 评论
结束一天的代码 “战斗”,肩膀是不是又酸又胀?盯着屏幕上重复了 N 次的 DOM 操作代码,心里直犯堵 —— 给输入框加防抖、按钮加权限控制、图片加懒加载,每次都要写一堆重复逻辑,改一处还要查遍所有组件,烦躁到想摔键盘?别着急!今晚就送你一个 “代码偷懒” 神器:Vue 自定义指令,让重复 DOM 操作一键复用,明天写代码直接 “开挂”!先问问大家,有没有遇到过多个组件里写相同的 DOM 操作,改起来像 “拆东墙补西墙” 的情况?答案马上为你解开~
自定义指令:DOM 操作的 “私人定制管家”
在 Vue 开发中,虽然提倡数据驱动视图,但总有一些场景需要和 DOM “亲密接触”。比如给按钮添加 loading 状态、输入框自动聚焦、元素拖拽排序…… 每次都重复写这些逻辑,效率低还容易出错。而自定义指令,就像是一位 “私人定制管家”,能把这些通用操作封装成 “指令”,哪里需要用哪里,从此和重复代码说拜拜~
Vue2 自定义指令:轻松封装通用逻辑
在 Vue2 中,通过Vue.directive定义全局指令,或在组件中通过directives选项定义局部指令。比如封装一个 “自动聚焦” 指令:
// 全局定义自动聚焦指令
Vue.directive('auto-focus', {
// 当指令绑定的元素插入DOM时调用
inserted: function (el) {
// 让元素自动获取焦点
el.focus();
}
});
// 在模板中使用
<template>
<div>
<!-- 登录页输入框自动聚焦 -->
<input type="text" v-auto-focus placeholder="用户名">
</div>
</template>
再比如封装一个 “按钮防抖” 指令,防止用户频繁点击:
// 定义防抖指令
Vue.directive('debounce-click', {
// 绑定事件处理函数
bind: function (el, binding) {
let timer = null;
el.addEventListener('click', () => {
if (timer) clearTimeout(timer);
// 等待300ms后执行回调
timer = setTimeout(() => {
binding.value(); // 执行用户传入的函数
}, 300);
});
}
});
// 使用时传入点击事件处理函数
<template>
<button v-debounce-click="handleSubmit">提交表单</button>
</template>
Vue3 自定义指令:结合组合式 API 更灵活
Vue3 中自定义指令的写法基本一致,但结合组合式 API,能更方便地管理指令中的响应式数据:
// 在setup中定义局部指令
import { onMounted } from 'vue';
export default {
setup() {
// 定义图片懒加载指令
const lazyLoad = {
mounted: function (el, binding) {
// 使用Intersection Observer观察元素是否进入视口
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
el.src = binding.value; // 加载真实图片地址
observer.unobserve(el); // 停止观察
}
});
});
observer.observe(el);
}
};
return {
lazyLoad
};
}
};
// 模板中使用懒加载指令
<template>
<img v-lazy-load="realImageUrl" src="loading.gif" alt="懒加载图片">
</template>
代码注释亮点:每一步都明明白白
- 指令钩子函数:inserted/mounted在元素插入 DOM 时触发,bind在指令绑定到元素时触发
- 参数解析:el是绑定指令的 DOM 元素,binding.value是用户传入的参数
- 性能优化:懒加载示例中使用Intersection Observer,避免频繁调用getBoundingClientRect
- 逻辑复用:防抖指令中通过闭包保存定时器,确保多次点击时只执行最后一次
问题解答
开头提到的 “重复写 DOM 操作,改起来麻烦”,自定义指令能完美解决:
- 逻辑集中管理:把自动聚焦、防抖、懒加载等逻辑封装成指令,所有组件直接复用
- 减少代码冗余:一次定义,多处使用,修改时只需更新指令内部逻辑
- 保持组件纯净:组件只关注业务逻辑,DOM 操作细节交给指令处理
自定义指令 vs 组件 / 钩子函数,怎么选?
有人觉得自定义指令轻量灵活,适合简单 DOM 操作;也有人倾向用组件或组合式 API 钩子(如useDebounce),认为更符合 Vue 组件化思想。比如按钮防抖,指令写法简洁,而钩子函数更便于和响应式数据结合。你在项目中更常用哪种方式?有没有遇到过必须用指令才能解决的场景?来评论区分享你的经验吧~
今晚的小技巧就到这里啦~希望自定义指令能成为你代码里的 “效率神器”,让重复劳动少一点,摸鱼时间多一点~记得点赞关注,明天同一时间,还有更多实用技巧等你来解锁!祝你有个甜甜的梦,咱们明天见~
相关推荐
- 再说圆的面积-蒙特卡洛(蒙特卡洛方法求圆周率的matlab程序)
-
在微积分-圆的面积和周长(1)介绍微积分方法求解圆的面积,本文使用蒙特卡洛方法求解圆面积。...
- python创建分类器小结(pytorch分类数据集创建)
-
简介:分类是指利用数据的特性将其分成若干类型的过程。监督学习分类器就是用带标记的训练数据建立一个模型,然后对未知数据进行分类。...
- matplotlib——绘制散点图(matplotlib散点图颜色和图例)
-
绘制散点图不同条件(维度)之间的内在关联关系观察数据的离散聚合程度...
- python实现实时绘制数据(python如何绘制)
-
方法一importmatplotlib.pyplotaspltimportnumpyasnpimporttimefrommathimport*plt.ion()#...
- 简单学Python——matplotlib库3——绘制散点图
-
前面我们学习了用matplotlib绘制折线图,今天我们学习绘制散点图。其实简单的散点图与折线图的语法基本相同,只是作图函数由plot()变成了scatter()。下面就绘制一个散点图:import...
- 数据分析-相关性分析可视化(相关性分析数据处理)
-
前面介绍了相关性分析的原理、流程和常用的皮尔逊相关系数和斯皮尔曼相关系数,具体可以参考...
- 免费Python机器学习课程一:线性回归算法
-
学习线性回归的概念并从头开始在python中开发完整的线性回归算法最基本的机器学习算法必须是具有单个变量的线性回归算法。如今,可用的高级机器学习算法,库和技术如此之多,以至于线性回归似乎并不重要。但是...
- 用Python进行机器学习(2)之逻辑回归
-
前面介绍了线性回归,本次介绍的是逻辑回归。逻辑回归虽然名字里面带有“回归”两个字,但是它是一种分类算法,通常用于解决二分类问题,比如某个邮件是否是广告邮件,比如某个评价是否为正向的评价。逻辑回归也可以...
- 【Python机器学习系列】拟合和回归傻傻分不清?一文带你彻底搞懂
-
一、拟合和回归的区别拟合...
- 推荐2个十分好用的pandas数据探索分析神器
-
作者:俊欣来源:关于数据分析与可视化...
- 向量数据库:解锁大模型记忆的关键!选型指南+实战案例全解析
-
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...
- 用Python进行机器学习(11)-主成分分析PCA
-
我们在机器学习中有时候需要处理很多个参数,但是这些参数有时候彼此之间是有着各种关系的,这个时候我们就会想:是否可以找到一种方式来降低参数的个数呢?这就是今天我们要介绍的主成分分析,英文是Princip...
- 神经网络基础深度解析:从感知机到反向传播
-
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...
- Python实现基于机器学习的RFM模型
-
CDA数据分析师出品作者:CDALevelⅠ持证人岗位:数据分析师行业:大数据...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)