自定义指令是 Vue 提供的一个强大的功能,可以在标签上绑定一个指令,让这个指令具有特定的行为。Vue 中内置了多个指令,如 v-if、v-for 等,同时也支持开发者自定义指令。
自定义指令的语法为:Vue.directive(‘directiveName’, directiveOptions)。其中 directiveName 为指令名称,directiveOptions 为指令选项,其中至少包含 bind 和 update 两个钩子函数。
下面是一个自定义指令的示例:
<template>
<div>
<input v-focus>
</div>
</template>
<script>
export default {
directives: {
focus: {
// 当绑定元素插入到 DOM 中。
bind(el) {
// 聚焦元素
el.focus();
},
},
},
};
</script>
这个自定义指令是一个简单的聚焦输入框的功能,当 v-focus 指令被绑定到输入框上时,输入框会自动聚焦。
自定义指令的应用场景非常多,可以根据实际需要实现各种功能,如聚焦、拖拽、防抖等等。
下面是一些自定义指令的示例:
防抖指令,实现输入框输入防抖的效果。
<template>
<div>
<input v-debounce="handleInput">
</div>
</template>
<script>
export default {
directives: {
debounce: {
bind(el, binding) {
let timer;
el.addEventListener('input', () => {
clearTimeout(timer);
timer = setTimeout(() => {
binding.value();
}, binding.arg || 500);
});
},
},
},
methods: {
handleInput() {
// ...
},
},
};
</script>
拖拽指令,实现拖拽元素的效果。
<template>
<div>
<div v-drag>
Drag Me!
</div>
</div>
</template>
<script>
export default {
directives: {
drag: {
bind(el) {
el.style.position = 'absolute';
el.style.top = '0px';
el.style.left = '0px';
let startX, startY;
let dragging = false;
el.addEventListener('mousedown', e => {
startX = e.clientX;
startY = e.clientY;
dragging = true;
});
document.addEventListener('mousemove', e => {
if (dragging) {
const deltaX = e.clientX - startX;
const deltaY = e.clientY - startY;
el.style.top = `${el.offsetTop + deltaY}px`;
el.style.left = `${el.offsetLeft + deltaX}px`;
startX = e.clientX;
startY = e.clientY;
}
});
document.addEventListener('mouseup', () => {
dragging = false;
});
},
},
},
};
</script>
以下是自定义指令的一些常见应用场景: