Пользовательские директивы — это механизм Vue.js для создания собственных DOM-инструкций с реактивным поведением. Они позволяют напрямую работать с DOM-элементами, добавляя специфическую функциональность.
Назначение:
Отличие от компонентов:
Глобальные:
Vue.directive('focus', {
inserted: function (el) {
el.focus()
}
})
Локальные:
directives: {
focus: {
inserted: function (el) {
el.focus()
}
}
}
Каждая директива может содержать следующие хуки:
Vue.directive('demo', {
bind(el, binding, vnode) {
// Инициализация
},
inserted(el, binding, vnode) {
// Работа с DOM
},
update(el, binding, vnode, oldVnode) {
// Реакция на изменения
},
unbind(el, binding, vnode) {
// Уборка
}
})
Каждый хук получает следующие параметры:
name
: Имя директивы (без v-)value
: Переданное значениеoldValue
: Предыдущее значение (только в update)expression
: Строка выраженияarg
: Аргумент после двоеточияmodifiers
: Объект с модификаторамиПростая директива фокуса:
Vue.directive('focus', {
inserted(el) {
el.focus()
}
})
<input v-focus>
Директива с аргументами и модификаторами:
Vue.directive('pin', {
bind(el, binding) {
el.style.position = 'fixed'
const s = binding.arg || 'top'
el.style[s] = binding.value + 'px'
}
})
<div v-pin:bottom="200">Прикреплено 200px от низа</div>
Динамическое изменение стилей:
Vue.directive('color-swatch', {
bind(el, binding) {
el.style.backgroundColor = binding.value
},
update(el, binding) {
el.style.backgroundColor = binding.value
}
})
В Vue 3 API директив изменился для согласованности с жизненным циклом компонента:
const app = Vue.createApp({})
app.directive('focus', {
mounted(el) {
el.focus()
}
})
Основные изменения:
bind
→ beforeMount
inserted
→ mounted
update
→ удален (используйте beforeUpdate
)componentUpdated
→ updated
unbind
→ unmounted
пользовательские директивы — это мощный инструмент для низкоуровневых DOM-манипуляций в Vue.js. Они особенно полезны для интеграции сторонних библиотек, создания специфичного DOM-поведения и повторно используемых DOM-декораторов. Однако их следует использовать умеренно, отдавая предпочтение компонентам в большинстве случаев.