首页 游戏 软件 资讯 排行榜 专题
首页
业界动态
Vue2与Vue3通用十大高频自定义指令实战代码分享

Vue2与Vue3通用十大高频自定义指令实战代码分享

热心网友
72
转载
2026-05-08

在Vue项目开发中,我们常常会遇到一些重复性的交互逻辑,比如按钮权限校验、防抖节流、图片懒加载等。把这些逻辑封装成自定义指令,往往是最优雅的解决方案——它不污染组件内部代码,复用性极强,堪称前端开发的“瑞士军刀”。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

今天,我们就来盘点十个在企业级Vue项目中间出镜率极高的自定义指令,无论是Vue 2还是Vue 3项目都能直接运行。你可以把它们看作一套开箱即用的工具集,复制粘贴到你的项目中,立刻就能提升开发效率。

1. v-permission 按钮权限控制(后台系统必用)

这是后台管理系统中的刚需功能。通常,后端会返回一个当前用户的权限码列表,前端需要根据这个列表来控制页面中按钮的显示与隐藏。用指令来实现,逻辑清晰且非侵入。

// directives/permission.js
import { useUserStore } from '@/stores/user'

export default {
  mounted(el, binding) {
    const { permissions } = useUserStore()
    const value = binding.value
    if (!value) return
    // 无权限则移除元素
    if (!permissions.includes(value)) {
      el.parentNode?.removeChild(el)
    }
  }
}

在模板中这样使用,语义非常直观:

2. v-debounce 防抖点击(搜索/提交防重复)

处理搜索框输入或表单提交时,防止用户短时间内频繁触发请求,防抖指令能帮你轻松搞定。

// directives/debounce.js
export default {
  mounted(el, binding) {
    const { func, delay = 300 } = binding.value
    let timer = null
    el.addEventListener('click', () => {
      clearTimeout(timer)
      timer = setTimeout(() => func(), delay)
    })
  }
}

使用时,通过一个配置对象传入处理函数和延迟时间:

3. v-throttle 节流指令(滚动/防狂点)

与防抖类似,但场景略有不同。比如防止滚动事件过于频繁触发,或者防止按钮被疯狂点击,节流是更合适的选择。

// directives/throttle.js
export default {
  mounted(el, binding) {
    const { func, delay = 500 } = binding.value
    let lastTime = 0
    el.addEventListener('click', () => {
      const now = Date.now()
      if (now - lastTime >= delay) {
        func()
        lastTime = now
      }
    })
  }
}

4. v-copy 一键复制文本

让用户一键复制订单号、邀请码等文本内容,能极大提升操作体验。这里利用了现代浏览器提供的 Clipboard API。

// directives/copy.js
export default {
  mounted(el, binding) {
    el.addEventListener('click', () => {
      const text = binding.value
      na vigator.clipboard.writeText(text).then(() => {
        // 这里以Element Plus的ElMessage为例,你可替换为项目中的提示组件
        ElMessage.success('复制成功')
      })
    })
  }
}

绑定需要复制的文本即可:

复制订单号

5. v-longpress 长按指令

移动端H5开发中,长按触发某个操作(如删除、预览)是很常见的交互。这个指令封装了鼠标(或触摸)事件的监听逻辑。

// directives/longpress.js
export default {
  mounted(el, binding) {
    const { func, time = 1000 } = binding.value
    let timer = null
    el.addEventListener('mousedown', () => {
      timer = setTimeout(() => func(), time)
    })
    el.addEventListener('mouseup mouselea ve', () => clearTimeout(timer))
  }
}

6. v-input-number 仅允许输入数字(支持小数)

对于只能输入数字的表单字段,与其在每个组件里写校验逻辑,不如用一个指令全局约束。这个版本还兼容了输入小数点的需求。

// directives/number.js
export default {
  mounted(el) {
    const input = el.tagName === 'INPUT' ? el : el.querySelector('input')
    input.addEventListener('input', () => {
      input.value = input.value.replace(/[^\d.]/g, '')
      const arr = input.value.split('.')
      // 确保最多只有一个小数点
      if (arr.length > 2) input.value = arr[0] + '.' + arr[1]
    })
  }
}

在输入框上直接使用:

7. v-lazy 图片懒加载(性能优化)

对于长列表中的图片,懒加载是提升首屏性能的关键。这里利用 Intersection Observer API 来监听元素是否进入视口。

// directives/lazy.js
export default {
  mounted(el, binding) {
    const observer = new IntersectionObserver(([{ isIntersecting }]) => {
      if (isIntersecting) {
        el.src = binding.value // 进入视口后赋值真实图片地址
        observer.unobserve(el) // 停止观察
      }
    })
    observer.observe(el)
  }
}

将图片的src替换为指令,传入图片地址:

\

8. v-draggable 元素拖拽

需要实现一个可随意拖动的浮窗或元素?这个指令提供了最基础的拖拽实现,通过监听鼠标事件来更新元素位置。

// directives/drag.js
export default {
  mounted(el) {
    el.style.cssText += ";position:fixed;cursor:move;'
    el.addEventListener('mousedown', (e) => {
      const x = e.clientX - el.offsetLeft
      const y = e.clientY - el.offsetTop
      const move = (e) => {
        el.style.left = e.clientX - x + 'px'
        el.style.top = e.clientY - y + 'px'
      }
      document.addEventListener('mousemove', move)
      document.addEventListener('mouseup', () => {
        document.removeEventListener('mousemove', move)
      }, { once: true })
    })
  }
}

9. v-watermark 页面水印(防截图)

对于一些内部系统或敏感数据页面,添加一层半透明的水印可以起到简单的警示作用。其原理是动态生成背景图。

// directives/watermark.js
export default {
  mounted(el, binding) {
    const text = binding.value || '内部资料'
    const canvas = document.createElement('canvas')
    canvas.width = 200
    canvas.height = 150
    const ctx = canvas.getContext('2d')
    ctx.font = '14px Arial'
    ctx.fillStyle = 'rgba(0,0,0,0.1)'
    ctx.rotate(-0.2) // 轻微旋转
    ctx.fillText(text, 20, 50)
    el.style.background = `url(${canvas.toDataURL()}) repeat`
  }
}

10. v-auto-height 自适应高度(表格/弹窗常用)

在处理表格、弹窗等需要根据窗口大小自适应高度的组件时,手动计算高度往往很麻烦。这个指令可以自动完成。

// directives/autoHeight.js
export default {
  mounted(el) {
    const resize = () => {
      const top = el.getBoundingClientRect().top
      // 计算可用高度,这里减去的20px可作为底部边距调整
      el.style.height = window.innerHeight - top - 20 + 'px'
    }
    resize()
    window.addEventListener('resize', resize)
    el._resize = resize // 将函数挂载到元素上,便于卸载时移除
  },
  unmounted(el) {
    window.removeEventListener('resize', el._resize)
  }
}

11. 统一注册(Vue3)

指令多了,管理起来也需要条理。最佳实践是在一个入口文件中统一注册。

首先,在 `directives/index.js` 中集中导出:

import permission from './permission'
import debounce from './debounce'
// ... 导入其他所有指令

export default {
  install(app) {
    app.directive('permission', permission)
    app.directive('debounce', debounce)
    // ... 注册其他所有指令
  }
}

然后,在项目入口文件 `main.js` 中全局使用:

import directives from '@/directives'
app.use(directives)

以上这十个指令,覆盖了权限、交互、性能、UI等多个常见场景。将它们纳入你的项目工具箱,下次再遇到类似需求,就可以信手拈来,让代码更加简洁和高效。

来源:https://www.51cto.com/article/842506.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

Vue2与Vue3通用十大高频自定义指令实战代码分享
业界动态
Vue2与Vue3通用十大高频自定义指令实战代码分享

自定义指令是解决Vue项目中重复交互逻辑的优雅方案,复用性强且不污染组件。本文介绍了十个高频实用指令,包括按钮权限控制、防抖节流、图片懒加载、一键复制、长按触发、数字输入限制、元素拖拽、页面水印和自适应高度。这些指令适用于Vue2和Vue3项目,可直接复制使用,能有效提升开发效率。

热心网友
05.08
Sublime Text安装Vue语法高亮插件详细图文教程
编程语言
Sublime Text安装Vue语法高亮插件详细图文教程

首先需要明确一个核心问题:Sublime Text 编辑器在默认情况下完全不支持 vue 文件,打开后只会显示为纯文本。这并不是因为你操作有误,而是编辑器本身缺乏内置的 Vue 语法支持。目前,唯一持续维护、兼容 Sublime Text 4、并能正确高亮 、、 等 Vue 单文件组件区块的插件,

热心网友
05.07
CSS实现0.5像素细边框的五种实用方法
编程语言
CSS实现0.5像素细边框的五种实用方法

引言 搞移动端开发的设计师,是不是常跟你提这个需求:边框要“再细一点”,最好能做成0 5物理像素的极细线?但写代码的都知道,CSS里最小单位就是1px(逻辑像素)。这中间的落差,在高清屏上尤其扎眼——一条本该精致的线,愣是变成了粗重的描边。今天,我们就来拆解这个经典难题,聊聊如何用几种扎实的方案,真

热心网友
05.07
声明式编程和命令式编程的核心差异详解
编程语言
声明式编程和命令式编程的核心差异详解

声明式编程与命令式编程的区别 在编程世界里,我们与机器沟通的方式大致可以分为两种风格:一种是告诉它“你想要什么”,另一种则是命令它“具体怎么做”。这两种风格,就是我们今天要聊的声明式编程和命令式编程。 声明式编程:告诉“机器”你想要的是什么(what),让机器想出如何去做(how)。 这种方式更像是

热心网友
05.07
Vue渲染中Patch如何处理自定义Web组件兼容性
前端开发
Vue渲染中Patch如何处理自定义Web组件兼容性

Vue将自定义WebComponents视为原生DOM节点,不进行实例化或注入响应式系统。在挂载和更新时,Vue仅负责创建元素、同步attributes并渲染插槽内容,其余生命周期与更新逻辑交由浏览器原生机制处理。属性需通过attribute同步,事件监听可直接绑定。兼容旧浏览器时,应进行特性检测与降级,或引入Polyfill,并避免混用未注册标签。二者协作

热心网友
05.06

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

欧宝2028年将推出基于零跑技术的平价纯电SUV
iphone
欧宝2028年将推出基于零跑技术的平价纯电SUV

欧宝宣布将于2028年推出一款基于零跑汽车技术打造的全新纯电动紧凑型SUV。新车开发周期不足两年,由中德团队联合开发,采用零跑电动架构与电池技术,并在西班牙工厂生产。参考平台零跑B10续航最高434公里(增程版可达900公里),起售价约23 9万元人民币,欧宝承诺新车将主打“可负担”定位。与此同时,

热心网友
05.08
全球首艘2.4万箱甲醇动力集装箱船完工 将于6月交付
iphone
全球首艘2.4万箱甲醇动力集装箱船完工 将于6月交付

全球航运绿色化进程取得重大突破。首艘2 4万箱级甲醇双燃料集装箱船“东方智慧”轮已在南通建造完工。该船总长近400米,最大载箱量超过2 4万标准箱,搭载了全球首创的最大甲醇双燃料动力系统,可实现甲醇与燃油的双模式切换,旨在应对航运业的减排需求。船舶即将开始海试,并计划于今年6月交付运营,标志着我国在

热心网友
05.08
DeepBook币DEEP未来走势预测 技术面与链上数据全面分析
web3.0
DeepBook币DEEP未来走势预测 技术面与链上数据全面分析

判断DeepBook币未来走势需结合技术面与数据面分析。技术面关注价格趋势、关键支撑阻力位及交易量变化,数据面则需审视链上活跃度、持币地址分布及生态发展进度。市场情绪与宏观环境同样重要,投资者应建立动态观察清单,综合评估而非依赖单一指标,在波动中保持理性决策。

热心网友
05.08
多地治理高速慢车并排行驶行为违规车辆已受处罚
iphone
多地治理高速慢车并排行驶行为违规车辆已受处罚

一段高速两车并排龟速行驶的视频近日引发热议。在道路空旷的情况下,两车以约80公里时速并排占据车道,后方车辆鸣笛闪灯提醒无效,导致车流受阻。这种行为显著增加追尾风险,尤其在能见度低时更为危险。目前,包括深圳在内的多地已开始治理龟速行驶,违法者将面临罚款记分处罚。交通部门提醒,驾驶员应保持合理车速,避免

热心网友
05.08
AI推荐盗版链接平台被诉 法院判决无主观过错不担责
iphone
AI推荐盗版链接平台被诉 法院判决无主观过错不担责

近日,一起由AI搜索引擎推荐盗版链接引发的著作权案宣判。用户通过AI平台搜索正版电视剧时,结果页置顶显示了盗版网盘链接。版权方据此起诉平台索赔。法院审理后认为,该平台基于大语言模型技术自动抓取和呈现网络公开信息,无证据表明其进行了人工或刻意推荐,因此不存在主观侵权过错。平台在收到侵权通知后已立即

热心网友
05.08