百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

DOM 操作总重复?1 个自定义指令技巧

ztj100 2025-06-12 19:08 84 浏览 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 操作,改起来麻烦”,自定义指令能完美解决:

  1. 逻辑集中管理:把自动聚焦、防抖、懒加载等逻辑封装成指令,所有组件直接复用
  2. 减少代码冗余:一次定义,多处使用,修改时只需更新指令内部逻辑
  3. 保持组件纯净:组件只关注业务逻辑,DOM 操作细节交给指令处理

自定义指令 vs 组件 / 钩子函数,怎么选?

有人觉得自定义指令轻量灵活,适合简单 DOM 操作;也有人倾向用组件或组合式 API 钩子(如useDebounce),认为更符合 Vue 组件化思想。比如按钮防抖,指令写法简洁,而钩子函数更便于和响应式数据结合。你在项目中更常用哪种方式?有没有遇到过必须用指令才能解决的场景?来评论区分享你的经验吧~

今晚的小技巧就到这里啦~希望自定义指令能成为你代码里的 “效率神器”,让重复劳动少一点,摸鱼时间多一点~记得点赞关注,明天同一时间,还有更多实用技巧等你来解锁!祝你有个甜甜的梦,咱们明天见~

相关推荐

Linux集群自动化监控系统Zabbix集群搭建到实战

自动化监控系统...

systemd是什么如何使用_systemd/system

systemd是什么如何使用简介Systemd是一个在现代Linux发行版中广泛使用的系统和服务管理器。它负责启动系统并管理系统中运行的服务和进程。使用管理服务systemd可以用来启动、停止、...

Linux服务器日常巡检脚本分享_linux服务器监控脚本

Linux系统日常巡检脚本,巡检内容包含了,磁盘,...

7,MySQL管理员用户管理_mysql 管理员用户

一、首次设置密码1.初始化时设置(推荐)mysqld--initialize--user=mysql--datadir=/data/3306/data--basedir=/usr/local...

Python数据库编程教程:第 1 章 数据库基础与 Python 连接入门

1.1数据库的核心概念在开始Python数据库编程之前,我们需要先理解几个核心概念。数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它就像一个电子化的文件柜,能让我们高效...

Linux自定义开机自启动服务脚本_linux添加开机自启动脚本

设置WGCloud开机自动启动服务init.d目录下新建脚本在/etc/rc.d/init.d新建启动脚本wgcloudstart.sh,内容如下...

linux系统启动流程和服务管理,带你进去系统的世界

Linux启动流程Rhel6启动过程:开机自检bios-->MBR引导-->GRUB菜单-->加载内核-->init进程初始化Rhel7启动过程:开机自检BIOS-->M...

CentOS7系统如何修改主机名_centos更改主机名称

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1.前言本文将讲解CentOS7系统如何修改主机名。...

前端工程师需要熟悉的Linux服务器(SSH 终端操作)指令

在Linux服务器管理中,SSH(SecureShell)是远程操作的核心工具。以下是SSH终端操作的常用命令和技巧,涵盖连接、文件操作、系统管理等场景:一、SSH连接服务器1.基本连接...

Linux开机自启服务完全指南:3步搞定系统服务管理器配置

为什么需要配置开机自启?想象一下:电商服务器重启后,MySQL和Nginx没自动启动,整个网站瘫痪!这就是为什么开机自启是Linux运维的必备技能。自启服务能确保核心程序在系统启动时自动运行,避免人工...

Kubernetes 高可用(HA)集群部署指南

Kubernetes高可用(HA)集群部署指南本指南涵盖从概念理解、架构选择,到kubeadm高可用部署、生产优化、监控备份和运维的全流程,适用于希望搭建稳定、生产级Kubernetes集群...

Linux项目开发,你必须了解Systemd服务!

1.Systemd简介...

Linux系统systemd服务管理工具使用技巧

简介:在Linux系统里,systemd就像是所有进程的“源头”,它可是系统中PID值为1的进程哟。systemd其实是一堆工具的组合,它的作用可不止是启动操作系统这么简单,像后台服务...

Red Hat Enterprise Linux 10 安装 Kubernetes (K8s) 集群及高级管理

一、前言...

Linux下NetworkManager和network的和平共处

简介我们在使用CentoOS系统时偶尔会遇到配置都正确但network启动不了的问题,这问题经常是由NetworkManager引起的,关闭NetworkManage并取消开机启动network就能正...

取消回复欢迎 发表评论: