Vue.js предоставляет мощные механизмы для динамического управления классами и стилями элементов, позволяя изменять внешний вид компонентов в зависимости от состояния данных. Это позволяет создавать гибкие и интерактивные интерфейсы без прямого манипулирования DOM.
Для динамического управления классами используется директива
v-bind:class или её сокращённая запись :class.
Существуют три основных способа передачи значений:
Строка Класс передаётся как строка:
<div :class="activeClass"></div>
data() {
return {
activeClass: 'highlight'
}
}
Элемент получит класс highlight.
Объект Ключи объекта — это имена классов, значения — булевы выражения:
<div :class="{ active: isActive, 'text-large': isLarge }"></div>
data() {
return {
isActive: true,
isLarge: false
}
}
Класс active будет применён, а text-large —
нет.
Массив Можно передавать массив строк и объектов:
<div :class="[activeClass, { 'text-large': isLarge }]"></div>
data() {
return {
activeClass: 'highlight',
isLarge: true
}
}
Элемент получит классы highlight и
text-large.
Директива v-bind:style позволяет привязывать стили к
объекту или массиву объектов. Поддерживаются как обычные CSS-свойства в
camelCase, так и строковые записи в kebab-case.
Объект
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data() {
return {
activeColor: 'red',
fontSize: 18
}
}
Стиль элемента будет изменяться при изменении
activeColor или fontSize.
Массив объектов Можно комбинировать несколько наборов стилей:
<div :style="[baseStyles, overrideStyles]"></div>
data() {
return {
baseStyles: { color: 'blue', fontSize: '14px' },
overrideStyles: { fontWeight: 'bold' }
}
}
Результирующие стили объединяются, где значения из последнего объекта перекрывают предыдущие.
Для более сложной логики удобно использовать вычисляемые свойства. Они позволяют динамически формировать классы и стили на основе данных компонента:
computed: {
buttonClasses() {
return {
active: this.isActive,
disabled: this.isDisabled
}
},
buttonStyles() {
return {
color: this.isActive ? 'green' : 'gray',
fontSize: this.isLarge ? '20px' : '14px'
}
}
}
<button :class="buttonClasses" :style="buttonStyles">Кнопка</button>
Динамические классы и стили часто используются для условного отображения состояния:
<div :class="{ visible: isVisible, hidden: !isVisible }"></div>
<div :style="{ opacity: isVisible ? 1 : 0, transition: 'opacity 0.5s' }"></div>
Такой подход обеспечивает плавную визуальную реакцию на изменения данных.
Vue.js позволяет комбинировать массивы, объекты и строки одновременно:
<div :class="['base', dynamicClass, { active: isActive }]"
:style="[baseStyle, conditionalStyle]"></div>
Это позволяет строить сложные системы стилизации без избыточного кода, обеспечивая чистоту и читаемость компонентов.
Использование :style удобно для динамических значений,
зависящих от вычислений. Для повторно используемых стилей
предпочтительно применять :class, так как это упрощает
поддержку CSS и уменьшает количество инлайновых правил.
Динамические классы и стили работают не только с HTML-элементами, но и с пользовательскими компонентами:
<MyButton :class="{ primary: isPrimary }" :style="{ padding: buttonPadding + 'px' }" />
Компонент должен корректно передавать атрибуты class и
style на корневой элемент внутри себя для корректного
отображения.
Изменения данных, привязанных к :class или
:style, автоматически обновляют DOM. Важно помнить, что Vue
отслеживает только существующие свойства объекта. Для добавления новых
реактивных свойств рекомендуется использовать Vue.set или
reactive/ref в Composition API.
Динамические классы и стили — ключевой инструмент создания интерактивных интерфейсов в Vue.js. Их правильное использование обеспечивает гибкость, упрощает поддержку кода и позволяет эффективно управлять визуальной составляющей компонентов.