Директивы во Vue.js представляют собой специальные атрибуты,
расширяющие стандартный HTML и позволяющие привязывать поведение и
данные к DOM-элементам. Каждая директива начинается с префикса
v- и интерпретируется фреймворком на этапе компиляции
шаблона.
Директивы обеспечивают декларативный подход к управлению интерфейсом, при котором логика описывается через связи между состоянием и представлением, а не через прямые манипуляции DOM.
Директива v-bind используется для динамической привязки
HTML-атрибутов к данным компонента.
Синтаксис:
<img v-bind:src="imageUrl" />
Сокращённая форма:
<img :src="imageUrl" />
Особенности:
Пример привязки объекта:
<div :class="{ active: isActive, disabled: isDisabled }"></div>
Привязка стилей:
<div :style="{ color: textColor, fontSize: fontSize + 'px' }"></div>
v-model создаёт синхронизацию между input-элементом и
состоянием компонента.
<input v-model="username" />
Эквивалент ручной реализации:
<input
:value="username"
@input="username = $event.target.value"
/>
Используется с:
Модификаторы:
.lazy — обновление по событию change
<input v-model.lazy="value" />
.number — преобразование в число
<input v-model.number="age" />
.trim — удаление пробелов
<input v-model.trim="text" />
Директивы условного отображения управляют присутствием элементов в DOM.
<div v-if="isLoggedIn">Профиль</div>
<div v-else>Войти</div>
Цепочка условий:
<div v-if="status === 'loading'">Загрузка</div>
<div v-else-if="status === 'error'">Ошибка</div>
<div v-else>Готово</div>
Особенности:
<template> для группировки<div v-show="isVisible">Контент</div>
Отличия от v-if:
display<li v-for="item in items" :key="item.id">
{{ item.name }}
</li>
Поддерживаемые формы:
Массив:
<div v-for="user in users" :key="user.id">
{{ user.name }}
</div>
Индекс:
<div v-for="(user, index) in users" :key="index">
{{ index }} - {{ user.name }}
</div>
Объекты:
<div v-for="(value, key) in object" :key="key">
{{ key }}: {{ value }}
</div>
Диапазоны:
<span v-for="n in 10" :key="n">{{ n }}</span>
Ключ key критически важен для корректного обновления
виртуального DOM.
<button v-on:click="handleClick">Нажать</button>
Сокращение:
<button @click="handleClick">Нажать</button>
Передача аргументов:
<button @click="handleClick(id)">Удалить</button>
Доступ к событию:
<button @click="handleClick($event)">Клик</button>
.stop — остановка всплытия
<button @click.stop="handleClick"></button>
.prevent — preventDefault
<form @submit.prevent="submitForm"></form>
.once — однократное выполнение
<button @click.once="init"></button>
.self — только на текущем элементе
<div @click.self="handle"></div>
<div :class="{ active: isActive }"></div>
Массив классов:
<div :class="['base', condition ? 'active' : '']"></div>
<div :style="{ backgroundColor: bgColor }"></div>
Используется для вставки HTML-кода из строки.
<div v-html="rawHtml"></div>
Особенности:
Альтернатива интерполяции {{ }}:
<div v-text="message"></div>
Полностью заменяет текстовое содержимое элемента.
Vue позволяет использовать выражения в качестве аргументов:
<a v-bind:[attributeName]="url"></a>
<button v-on:[eventName]="handler"></button>
Особенности:
Vue предоставляет возможность создавать собственные директивы для работы с DOM на низком уровне.
Регистрация локальной директивы:
directives: {
focus: {
mounted(el) {
el.focus()
}
}
}
Использование:
<input v-focus />
Пользовательские директивы поддерживают набор хуков:
createdbeforeMountmountedbeforeUpdateupdatedbeforeUnmountunmountedПример:
app.directive('demo', {
mounted(el, binding) {
el.style.color = binding.value
}
})
Аргументы:
<div v-demo:foo="value"></div>
Модификаторы:
<div v-demo.uppercase="value"></div>
Доступ в директиве:
binding.arg
binding.modifiers
binding.value
Хотя v-slot не является классической директивой
DOM-уровня, она используется для управления распределением контента в
компонентах.
<template v-slot:header>
Заголовок
</template>
Сокращённая форма:
<template #header>
Заголовок
</template>
<div v-once>
{{ staticContent }}
</div>
Элемент рендерится один раз и не обновляется.
<div v-memo="[value]">
{{ value }}
</div>
Оптимизация повторного рендеринга при неизменных зависимостях.
Директивы тесно связаны с реактивной системой Vue. Любое изменение состояния автоматически приводит к пересчёту шаблона и обновлению DOM, если директивы зависят от изменённых данных.
Механизм основан на:
На одном элементе может использоваться несколько директив:
<div v-if="show" v-for="item in list"></div>
Важно учитывать порядок обработки:
v-if имеет более высокий приоритетv-for выполняется до условного рендеринга в некоторых
сценариях компиляцииКомбинация v-model и кастомных компонентов:
<custom-input v-model="value" />
Эквивалент:
<custom-input
:modelValue="value"
@update:modelValue="value = $event"
/>
Работа директив формирует основу декларативного подхода Vue.js, обеспечивая управление DOM через связку реактивного состояния и шаблонов без необходимости прямых манипуляций элементами страницы.