Олег Марков
Руководство по div во Vue
Введение
Работа с HTML-элементами является базовым навыком во фронтенд-разработке, а элемент <div> — самый распространённый контейнер для верстки и управления размещением контента. Во Vue использование <div> часто встречается как в шаблонах компонентов, так и при применении директив для динамической генерации, управления классами, стилями и условиями показа. Понимание всех нюансов позволит вам создавать гибкие и масштабируемые интерфейсы. В этой статье вы узнаете, как эффективно задействовать <div> во Vue. Давайте подробно разберём, как работает элемент <div> в экосистеме Vue — с точки зрения синтаксиса, реактивности, динамического управления и приемов, которые пригодятся для повседневной разработки.
Основы использования div во Vue
Простое добавление div
Vue-компоненты используют так называемый шаблонный синтаксис. Это похоже на обычный HTML, но вы можете вставлять реактивные данные и директивы. Смотрите, как выглядит самый простой пример использования <div>:
<template>
<div>
Привет, это базовый div в Vue
</div>
</template>Этот пример создаёт обычный div-контейнер. Здесь нет никаких особенностей — все работает как привычный HTML. Но сила Vue раскрывается, когда вы добавляете динамику.
Разбор работы с элементом div — это фундамент для создания любой верстки во Vue. Но для разработки сложных и адаптивных интерфейсов, важно также понимать, как организовать компоненты, управлять состоянием и обеспечить навигацию между страницами. Если вы хотите получить комплексные знания и навыки в разработке Vue-приложений, приходите на наш большой курс Vue.js 3, Vue Router и Pinia. На курсе 173 уроков и 21 упражнение, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.
Внедрение данных во внутренность div
Чтобы выводить переменные, используйте двойные фигурные скобки ({{ }}):
<template>
<div>
{{ message }} <!-- Здесь будет выведено значение data.message -->
</div>
</template>
<script>
export default {
data() {
return {
message: 'Добро пожаловать на сайт'
}
}
}
</script>Vue автоматически обновит содержимое див блока, если значение message изменится.
Использование классов и стилей
Динамические классы
Иногда необходимо задать класс элементу div в зависимости от данных. Во Vue для этого используется директива :class (сокращение от v-bind:class):
<template>
<div :class="{ active: isActive, error: hasError }">
Текст дива со стилями
</div>
</template>
<script>
export default {
data() {
return {
isActive: true,
hasError: false
}
}
}
</script>В этом примере, если isActive равно true, div получит класс active. Если hasError также станет true — добавится класс error.
Классы на основе массива
Если вам нужно добавить сразу несколько классов, используйте массив:
<template>
<div :class="['main-div', isActive ? 'active' : '', customClass]">
Массив классов
</div>
</template>
<script>
export default {
data() {
return {
isActive: true,
customClass: 'rounded'
}
}
}
</script>Инлайн-стили
Вы также можете управлять стилями через объект:
<template>
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }">
Стилизация дива
</div>
</template>
<script>
export default {
data() {
return {
activeColor: 'blue',
fontSize: 20
}
}
}
</script>Условия отображения div
Vue предлагает простую и выразительную работу с условиями в шаблонах.
v-if
С помощью v-if вы управляете, отрисовывать ли див в DOM:
<template>
<div v-if="showDiv">
Этот div видим, когда showDiv true
</div>
</template>
<script>
export default {
data() {
return {
showDiv: true
}
}
}
</script>v-show
Если есть частая необходимость скрывать и показывать блоки без удаления их из DOM, используйте v-show:
<template>
<div v-show="shouldShow">
Этот див всегда существует, но может быть скрыт
</div>
</template>v-ifполностью удаляет/создаёт элемент в DOM.v-showуправляет только стилями (display: none).
Работа со списками и div
Одно из частых применений <div> во Vue — вывод списков данных.
<template>
<div>
<div v-for="user in users" :key="user.id">
Пользователь: {{ user.name }}
</div>
</div>
</template>
<script>
export default {
data() {
return {
users: [
{ id: 1, name: 'Анна' },
{ id: 2, name: 'Петр' }
]
}
}
}
</script>Здесь применяется директива v-for, и для каждого пользователя рендерится отдельный div.
Вложенные div и компоненты
Вложенность <div> необходима для создания сложных макетов:
<template>
<div class="container">
<div class="header">
Заголовок
</div>
<div class="content">
<div class="sidebar">Меню</div>
<div class="main">Контент</div>
</div>
</div>
</template>Такой подход помогает визуально разделять разные части интерфейса.
Получение доступа к div через ref
Если нужен прямой доступ к DOM-элементу div — например, чтобы измерить его размеры или применить стороннюю библиотеку, используйте ref:
<template>
<div ref="myDiv">
Див, на который мы ссылаемся
</div>
<button @click="logWidth">Показать ширину</button>
</template>
<script>
export default {
methods: {
logWidth() {
// Получаем прямой доступ к DOM-элементу div
const div = this.$refs.myDiv
console.log(div.offsetWidth) // Выводим ширину div
}
}
}
</script>div как корневой элемент компонента
Во Vue 2 каждый компонент обязан иметь один корневой элемент. Обычно это именно <div>. Пример:
<template>
<div>
<h1>Заголовок</h1>
<p>Текст внутри дива</p>
</div>
</template>Во Vue 3 вы можете использовать несколько корневых элементов, но обёртка <div> всё равно часто применяется для группировки:
<template>
<h1>Заголовок</h1>
<div>Контейнер с описанием</div>
</template>Динамические теги (component is)
Иногда приходится рендерить разные теги условно — например, <div> или <section>. Для этого применяйте встроенный компонент <component :is="tagName">:
<template>
<component :is="currentTag">
Этот блок может быть и div, и section
</component>
</template>
<script>
export default {
data() {
return {
currentTag: 'div'
}
}
}
</script>Передача обработчиков событий на div
Вы можете навесить стандартные события на <div>, как в обычном HTML:
<template>
<div @click="onClickDiv">
Кликни меня!
</div>
</template>
<script>
export default {
methods: {
onClickDiv() {
alert('Див был нажат!')
}
}
}
</script>Реактивные атрибуты
Если вам нужно динамически изменять другие атрибуты — например, id или data-*, используйте директиву :attr:
<template>
<div :id="blockId" :data-status="status">
Див с динамическими атрибутами
</div>
</template>
<script>
export default {
data() {
return {
blockId: 'user-block',
status: 'active'
}
}
}
</script>В шаблоне можно привязывать любые атрибуты с помощью :.
Использование div как layout wrapper
Один из самых частых приёмов — делать див обёрткой для других компонентов или элементов, чтобы реализовать layout.
<template>
<div class="wrapper">
<slot></slot> <!-- Вставка содержимого из родителя -->
</div>
</template>Такой вариант часто используется для создания каркаса страницы, модальных окон, панелей и т. д.
Анимации и переходы с div
Vue позволяет анимировать появление и исчезновение div с помощью специального компонента <transition>.
<template>
<transition name="fade">
<div v-if="visible" class="animated-div">
Я плавно появляюсь и исчезаю
</div>
</transition>
<button @click="toggle">Переключить блок</button>
</template>
<script>
export default {
data() {
return {
visible: true
}
},
methods: {
toggle() {
this.visible = !this.visible
}
}
}
</script>
<style>
.fade-enter-active,
.fade-leave-active {
transition: opacity .5s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
</style>Здесь див появится и исчезнет с плавной анимацией за счет CSS-классов.
Использование v-html с div
Вы можете вставлять HTML-код во внутренность div с помощью директивы v-html:
<template>
<div v-html="htmlContent"></div>
</template>
<script>
export default {
data() {
return {
htmlContent: '<strong>Жирный текст</strong>'
}
}
}
</script>Важно: Будьте осторожны с v-html — не вставляйте непроверенные данные, это может привести к XSS-уязвимостям.
Ленивая загрузка и динамическая вставка div
Вы можете создавать div по условиям или подгружать их только при необходимости, что улучшает производительность.
<template>
<button @click="showBlock = true">Показать блок</button>
<div v-if="showBlock">
Этот div создаётся только при showBlock true
</div>
</template>Пример комплексной работы с div
Вот пример, где сочетаются условная отрисовка, стилизация, вывод списка и событие:
<template>
<div class="user-list">
<div
v-for="user in users"
:key="user.id"
:class="{ highlight: user.selected }"
@click="select(user.id)">
{{ user.name }}
</div>
<div v-if="!users.length">
Нет пользователей для отображения
</div>
</div>
</template>
<script>
export default {
data() {
return {
users: [
{ id: 1, name: 'Алексей', selected: false },
{ id: 2, name: 'Елена', selected: false }
]
}
},
methods: {
select(id) {
this.users = this.users.map(user => ({
...user,
selected: user.id === id
}))
}
}
}
</script>
<style>
.highlight {
background: #ff0;
}
</style>Как видите, здесь <div> используется сразу для нескольких целей: динамическое отображение, условная стилизация, обработка событий и отображение состояния, если список пуст.
В заключение
Элемент <div> — один из самых универсальных инструментов в разработке на Vue. В этой статье мы рассмотрели, как использовать <div> для вывода данных, организации макета, условного рендеринга, управления стилями и классами, работы со списками, анимации и доступа к DOM. Большая часть интерфейсных решений строится вокруг грамотной работы с контейнерами, и понимание всех возможностей, которые предоставляет Vue для управления div-блоками, позволяет создавать сложные и отзывчивые интерфейсы максимально эффективно. В каждый из приведённых приёмов вы можете привнести дополнительную логику и оформительские решения, добиваясь удобного и структурированного кода в ваших компонентах.
Знание элемента div является основой, но для создания современных Vue-приложений этого недостаточно. Необходимо уметь строить архитектуру, управлять маршрутизацией и эффективно использовать Pinia. На нашем курсе Vue.js 3, Vue Router и Pinia вы найдете все необходимые знания и навыки. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в мир Vue прямо сегодня.
Частозадаваемые технические вопросы по теме
Как можно программно создать div внутри компонента Vue?
Вы можете добавлять новые элементы div в шаблон, изменяя реактивные данные и используя списки с v-for. Для добавления единичного блока — например, по нажатию кнопки:
js
data() {
return {
showDiv: false
}
},
methods: {
addDiv() {
this.showDiv = true
}
}
html
<button @click="addDiv">Добавить div</button>
<div v-if="showDiv">Этот div добавился!</div>
Как удалить div из DOM после выполнения анимации?
Компонуйте <transition> с v-if. Когда условие становится false, анимация срабатывает, и Vue удаляет элемент из DOM, когда переход завершён. Пример:
html
<transition name="fade">
<div v-if="visible" class="block">...</div>
</transition>
Когда visible становится false, div исчезает с анимацией и пропадает из DOM.
Можно ли рендерить несколько div как root во Vue 2?
Во Vue 2 разрешён только один корневой элемент, обычно это div. Если нужен список, оберните элементы в общий div или используйте фрагменты при помощи плагинов.
Как избежать лишних div (div-обёрток) во Vue 3?
Во Vue 3 поддерживаются так называемые Fragment — просто вставляйте несколько тегов друг за другом в шаблоне. Если всё же появляется лишний div, убедитесь, что он реально нужен для layout или структуры.
Как правильно вложить обработку событий click для нескольких div внутри списка?
Используйте @click внутри каждого div в v-for, передавая уникальный идентификатор. Например:
html
<div v-for="item in items" :key="item.id" @click="selectItem(item.id)">
{{ item.name }}
</div>
Обработчик будет получать id нажатого div и не возникнет путаницы между блоками.
Постройте личный план изучения Vue до уровня Middle — бесплатно!
Vue — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Vue
Лучшие курсы по теме

Vue 3 и Pinia
Антон Ларичев
TypeScript с нуля
Антон Ларичев