Vue 自定义指令
在 Vue 中,指令(Directive)是一种非常实用的功能,它可以让你直接操作 DOM 元素。除了内置的指令(如 v-model
、v-if
、v-for
等),你还可以创建自己的 自定义指令,来实现特定的行为,比如自动 聚焦、拖拽、懒加载等。
本文将带你了解自定义指令的基本语法、使用方式,以及在 Vue 3 中注册和封装指令的方法。
什么是指令?
Vue 的指令是带有 v-
前缀的特殊属性,作用是将某种行为“指令”给 DOM 元素。例如:
<input v-model="username" />
这个 v-model
指令帮你实现了数据双向绑定。
但如果 Vue 没有内置你需要的行为,就可以通过 自定义指令 来扩展 Vue 的能力。
自定义指令的基础用法
你可以通过 app.directive()
注册一个全局指令,或在组件内通过 directives
选项注册局部指令。
下面是一个全局自定义指令的例子:
自动聚焦指令:v-focus
main.js
import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)
// 注册全局自定义指令 v-focus
app.directive('focus', {
mounted(el) {
el.focus()
}
})
app.mount('#app')
使用方式:
<template>
<input v-focus />
</template>
当这个组件挂载到页面上后,输入框会自动获取焦点。
指令的生命周期钩子
自定义指令支持多个生命周期钩子,你可以根据需要定义:
钩子函数 | 触发时机 |
---|---|
created | 指令绑定元素时调用(一次性) |
beforeMount | 元素插入到 DOM 前调用 |
mounted | 元素插入到 DOM 后调用 |
beforeUpdate | 组件更新前调用(可能多次) |
updated | 组件更新后调用(可能多次) |
beforeUnmount | 卸载之前调用 |
unmounted | 卸载完成后调用 |
例如:
app.directive('logger', {
mounted(el, binding) {
console.log('指令绑定值:', binding.value)
},
updated(el, binding) {
console.log('指令更新了,新的值:', binding.value)
}
})