前言
Vue暴露了自定义指令的API给我们,让我们除了使用内置指令外,我们还可以自己定义指令,定义好后和内置指令的方式非常类似;都是被绑定到Vue实例的DOM元素上,它们可以用于修改元素的样式、响应用户事件、操作DOM等等。
在Vue中,自定义指令由一个指令定义对象构成,该对象包含一些钩子函数和一些可选的属性。同时在使用的时候需要我们先注册,注册分为全局注册和局部注册;
通过自定义指令,我们可以在DOM元素上添加额外的行为和交互效果,以满足特定的需求。
全局注册
全局注册:在main.js中注册全局自定义指令;(只能注册一个)
Vue.directive("指令名称", {
//配置项
});
局部注册
局部可以注册多个,vue提供了一个directives对象用于局部注册;
export default {
directives: {
'指令名称': {
//配置项
},
},
};
模版使用
模板中任何元素上使用新的自定义指令,如下:
<input v-"指令名称" />
自定义指令中的钩子函数
bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)
update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新
componentUpdated:指令所在组件的 VNode及其子 VNode全部更新后调用。
unbind:只调用一次,指令与元素解绑时调用。
钩子函数参数
el:指令所绑定的元素,可以用来直接操作 DOM。
binding:一个对象,包含以下属性:
- name:指令名,不包括 v- 前缀。
- value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2。
- oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
- expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"。
- arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"。
- modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
应用场景
使用自定义指令可以满足我们日常一些场景,这里给出几个自定义指令的场景:
- 表单防止重复提交
- 图片懒加载
- 一键 Copy的功能
自定义指令实现防抖函数
<template>
<div>
<div class="box">
<h3 class="title">自定义指令</h3>
<div>
<span>自定义指令实现防抖函数:</span>
<input type="text" v-model="inputVal" v-debounce="inputVal">
</div>
</div>
</div>
</template>
<script>
let Timer = null
export default {
data () {
return {
inputVal: ''
}
},
// 自定义指令
directives: {
debounce: {
update (el, binding) {
if (Timer) {
clearTimeout(Timer)
}
Timer = setTimeout(() => {
console.log(binding.value)
// `发送请求。。。 请求参数 ${binding.value}`
}, 500)
}
}
}
}
</script>