当前位置: 首页 > news >正文

封装和使用自定义指令

在 Vue 中封装自定义指令是增强 DOM 操作能力的有效方式,下面通过几个典型场景展示如何封装和使用自定义指令。

基础自定义指令封装

示例 1:自动聚焦指令
// directives/focus.js
export const focus = {mounted(el) {el.focus() // 元素挂载后自动聚焦}
}// 在组件中使用
<template><input v-focus />
</template><script>
import { focus } from '@/directives/focus'export default {directives: { focus }
}
</script>
示例 2:权限控制指令
// directives/permission.js
export const permission = {mounted(el, binding) {const { value } = bindingconst userRoles = ['admin'] // 假设从 store 获取用户角色if (!userRoles.includes(value)) {el.parentNode && el.parentNode.removeChild(el) // 无权限则移除元素}}
}// 在组件中使用
<template><button v-permission="'admin'">管理按钮</button>
</template>

带参数和修饰符的指令

示例 3:防抖指令
// directives/debounce.js
export const debounce = {mounted(el, binding) {const { value, arg = 'click', modifiers } = bindingconst delay = modifiers.large ? 1000 : 300let timer = nullel.addEventListener(arg, () => {clearTimeout(timer)timer = setTimeout(() => value(), delay)})}
}// 在组件中使用
<template><button v-debounce.large="submit">防抖提交</button>
</template>

全局注册自定义指令

示例 4:在入口文件中全局注册
// main.js
import { createApp } from 'vue'
import App from './App.vue'// 批量导入指令
import * as directives from './directives'const app = createApp(App)// 全局注册所有指令
Object.keys(directives).forEach(key => {app.directive(key, directives[key])
})app.mount('#app')

高级用法:动态指令参数

示例 5:图片懒加载指令
// directives/lazy.js
export const lazy = {mounted(el, binding) {const observer = new IntersectionObserver((entries) => {entries.forEach(entry => {if (entry.isIntersecting) {el.src = binding.value // 进入视口时设置真实图片地址observer.unobserve(el) // 加载后停止观察}})})observer.observe(el) // 开始观察元素}
}// 在组件中使用
<template><img v-lazy="imageUrl" alt="懒加载图片" />
</template>

生命周期钩子

自定义指令有以下生命周期钩子:

  • beforeMount:指令第一次绑定到元素且在挂载父组件之前调用
  • mounted:元素已插入父 DOM 后调用
  • beforeUpdate:组件更新前调用
  • updated:组件更新后调用
  • beforeUnmount:元素卸载前调用
  • unmounted:元素卸载后调用

指令参数解构

在钩子函数中可以解构参数:

mounted(el, { value, arg, modifiers }) {// value: v-my-directive="xxx" 中的 xxx// arg: v-my-directive:xxx 中的 xxx// modifiers: v-my-directive.xxx 中的 xxx
}

注意事项

  1. DOM 操作:自定义指令主要用于直接操作 DOM,避免复杂业务逻辑
  2. 性能考量:频繁触发的指令(如滚动监听)需结合防抖 / 节流
  3. 兼容性:使用原生 DOM API 时需考虑浏览器兼容性
  4. 全局注册:常用指令建议全局注册,避免重复导入

通过合理封装自定义指令,可以大幅提升代码复用性和开发效率。

http://www.dtcms.com/a/296270.html

相关文章:

  • Mysql大数据架构设计:当表中数据超过800万时,对数据表进行分表操作,以及分页查询优化详解
  • linux常见面试题/笔试收录(一)
  • 《云计算蓝皮书 2025 》发布:云计算加速成为智能时代核心引擎
  • Unity VS Unreal Engine ,“电影像游戏的时代” 新手如何抉择引擎?(结)
  • EVAL长度限制突破方法
  • FastGPT:企业级智能问答系统,让知识库触手可及
  • 使用Claude Code从零到一打造一个现代化的GitHub Star项目管理器
  • 密码学与加密货币:构建去中心化信任的技术基石与未来挑战
  • 离线环境下如何优雅地部署 Mentor Questa
  • 在Ubuntu上使用QEMU仿真运行ARM汇编
  • 【​I2S:芯片设计中的“音频桥梁”​】
  • 使用 eBPF 实时捕获 TCP 重传告警:精准定位网络抖动问题
  • 点击按钮滚动到底功能vue的v-on:scroll运用
  • 亚马逊云科技实战架构:构建可扩展、高效率、无服务器应用
  • MinIO Go 客户端使用详解:对象存储开发实战指南
  • 风波不断,“奶粉第一股”贝因美渡劫
  • nginx有几种日志
  • 【vector定义】vector f(k, vector<int>(k));
  • 第三章:掌握 Redis 存储与获取数据的核心命令
  • 阿里v1支付系列验证码逆向/百度成语点选vmp逆向
  • 基于深度学习的胸部 X 光图像肺炎分类系统(四)
  • 电脑录屏软件推荐:如何使用oCam录制游戏、教程视频
  • 视频二维码在产品设备说明书中的应用
  • Docker4-容器化企业级应用
  • C++map和set
  • leetcode101.对称二叉树树(递归练习题)
  • 基于20和28 nm FPGAs的实现多通道、低非线性时间到数字转换器
  • 安全插座项目规划书
  • 嵌入式软件--stm32 DAY 9 定时器
  • 第五章 Freertos物联网实战 微信小程序篇