【vue】v-自定义指令

前言

在 Vue.js 中,v - 自定义指令 是一种强大的功能,允许开发者扩展 HTML 元素的行为,封装可复用的 DOM 操作逻辑。它类似于内置指令(如 v-modelv-show),但可以根据业务需求自定义功能。

自定义指令的基本概念

自定义指令主要用于操作 DOM 元素,比如:

  • 自动聚焦输入框
  • 格式化日期显示
  • 限制输入内容
  • 实现拖拽、滚动监听等交互 它适用于需要直接操作 DOM 的场景,当组件化方案(如 props、事件)不足以满足需求时,自定义指令是更合适的选择。

自定义指令的使用方式

Vue 提供了两种注册方式:全局注册局部注册

el和binding

在 Vue 自定义指令中,elbinding 是两个重要的参数:

1、el含义:指令所绑定的 DOM 元素本身

makefile 复制代码
javascript
el: HTMLElement

2、 binding 参数

typescript 复制代码
javascript
binding: {
  value: any,        // 传递给指令的值
  oldValue: any,     // 之前的值(仅在 updated 钩子中可用)
  arg: string,       // 传递给指令的参数
  modifiers: Object,  // 修饰符对象
  instance: Object,  // Vue 组件实例
  dir: Object        // 指令定义对象
}

3、案例

全局注册

通过 Vue.directive() 方法注册,可在整个应用中使用:

main.js 复制代码
// 自定义指令
Vue.directive('demo', { 
    mounted(el, binding) {
        console.log('=== el 是什么 ===')
        console.log('el:', el) 
        // 实际的 DOM 元素
        console.log('el.tagName:', el.tagName) 
        // 元素标签名 
        console.log('=== binding 是什么 ===') 
        console.log('binding:', binding)
        console.log('binding.value:', binding.value) 
        // '红色' 或 '蓝色'
        console.log('binding.arg:', binding.arg)
        // 'click'
        console.log('binding.modifiers:', binding.modifiers)
        // { modifier1: true, modifier2: true } 
        // 实际应用:根据传入的值改变文字颜色
        if (binding.value === '红色') { 
            el.style.color = 'red'
        } else if (binding.value === '蓝色') { 
            el.style.color = 'blue'
        }
    }
})

在模板中使用

html 复制代码
<!-- 父组件 --> 
<template> 
    <div> 
        <!-- 指令使用 -->
        <p v-demo="'红色'">这段文字会变成红色</p>
        <p v-demo="'蓝色'">这段文字会变成蓝色</p>
        <button v-demo:click.modifier1.modifier2="handleClick"> 点击按钮 </button>
    </div> 
</template>
<script setup>
const handleClick = () => { 
    console.log('按钮被点击了')
} 
</script
<input v-focus>

局部注册

在组件的 directives 选项中注册,仅在当前组件生效:

js 复制代码
export default {
    directives: { 
        // 注册局部指令 v-color 
        color: { 
            bind: function (el, binding) { 
                // 设置元素颜色为指令参数
                el.style.color = binding.value
            }
        } 
    } 
}
html 复制代码
<p v-color="'red'">这段文字是红色的</p>
相关推荐
付十一11 小时前
更新!Figma MCP + Cursor:大前端时代的UI到代码自动化
android·前端·ai编程
万岳科技程序员小金11 小时前
多端统一的教育系统源码开发详解:Web、小程序与APP的无缝融合
前端·小程序·软件开发·app开发·在线教育系统源码·教育培训app开发·教育培训小程序
软件架构师-叶秋11 小时前
Vue3+tyepescript+ElementPlus+Axios前端技术栈
前端·vue3·elementplus
AAA阿giao11 小时前
HTML/CSS/JS 页面渲染机制:揭秘浏览器如何将平凡代码点化为视觉魔法
前端·css·html
lichenyang45311 小时前
从零到一:编写一个简单的 Umi 插件并发布到 npm
前端·react.js·前端框架
一颗宁檬不酸11 小时前
ajxa实例操作
前端·ajax·api
文心快码BaiduComate11 小时前
CCF程序员大会码力全开:AI加速营,10w奖金等你拿!
前端·后端·程序员
前端西瓜哥12 小时前
Figma 协同编辑是如何做用户状态同步的?
前端
OpenTiny社区12 小时前
不止按钮和表格!TinyVue 偷偷上线 Space 组件,直接搞定「弹性+间距」布局
前端·vue.js·github
FogLetter12 小时前
Vue 全家桶深度探索:从语法精要到项目实战
前端·vue.js