Пользовательские директивы Vue3
В дополнение к основным директивам, заданным по умолчанию (v-model и v-show), Vue также позволяет регистрировать пользовательские директивы.
Ниже мы регистрируем глобальную директиву v-focus. Эта директива предназначена для того, чтобы элемент получал фокус при загрузке страницы:
Пример
Попробуйте »
Мы также можем использовать опцию directives в экземпляре для регистрации локальных директив, чтобы директиву можно было использовать только в этом экземпляре:
Пример
Попробуйте »
Хуки
Функции-хуки
Функция определения директивы предоставляет несколько функций-хуков (необязательно):
created: Вызывается перед применением атрибутов или обработчиков событий связанного элемента.beforeMount: Вызывается, когда директива впервые привязывается к элементу и до монтирования родительского компонента.mounted: Вызывается после монтирования родительского компонента привязанного элемента.beforeUpdate: Вызывается перед обновлением VNode содержащего компонента.updated: Вызывается после обновления VNode содержащего компонента и VNodes его дочерних компонентов.beforeUnmount: Вызывается один раз перед размонтированием родительского компонента привязанного элемента.unmounted: Вызывается один раз, когда директива отвязана от элемента, а родительский компонент был размонтирован.
Пример
Параметры функции-хука
Параметры функций-хуков:
el
elЭлемент, к которому привязана директива. Это можно использовать для прямого управления DOM.
binding
binding — это объект, содержащий следующие свойства:
instance: Экземпляр компонента, использующего директиву.value: Значение, переданное директиве. Например, вv-my-directive="1 + 1": Предыдущее значение, только в2。oldValue: в, значение —beforeUpdateиupdated: Доступно независимо от того, изменилось ли значение.arg: Параметр, переданный директиве (если есть). Например, вv-my-directive:foo: в, arg —"foo"。modifiers: Объект, содержащий модификаторы (если есть). Например, вv-my-directive.foo.bar: в, объект modifiers —{foo: true,bar: true}。dir: Объект, передаваемый в качестве аргумента при регистрации директивы. Например, в следующей директиве:
app.directive('focus', {
mounted(el) {
el.focus()
}
})dir будет следующим объектом:
{
mounted(el) {
el.focus()
}
}
vnode
Схема реального DOM-элемента, полученного в качестве параметра el.
prevNode
Предыдущий виртуальный узел, доступен только в хуках beforeUpdate и updated.
В следующем примере показано использование этих параметров:
Пример
Попробуйте »
Иногда нам не нужны другие функции-хуки, поэтому мы можем написать сокращённую функцию следующим образом:
Vue.directive('example', function (el, binding) {
// 设置指令的背景颜色
el.style.backgroundColor = binding.value.color
})
Функция директивы принимает любое допустимое JavaScript-выражение. В следующем примере передаётся объект JavaScript:
Пример
Попробуйте »