Как использовать условный рендеринг?

В Vue условный рендеринг позволяет отображать или скрывать элементы DOM в зависимости от состояния данных. Это реализуется через специальные директивы: v-if, v-else-if, v-else и v-show. Каждая из них работает по-своему, и важно понимать различия между ними, чтобы эффективно управлять визуализацией компонентов и элементов.

v-if — Основная директива для условного рендеринга

v-if полностью удаляет элемент из DOM, если условие ложно, и вставляет его заново, когда условие становится истинным.

Пример:

<template>
<div>
<p v-if="isLoggedIn">Добро пожаловать!</p>
<p v-else>Пожалуйста, войдите</p>
</div>
</template>
<script>
export default {
data() {
return {
isLoggedIn: true
}
}
}
</script>

Если isLoggedIn — true, отобразится первая строка. Если false — вторая.

v-else — Альтернатива v-if

v-else должен идти непосредственно после v-if или v-else-if, без промежуточных тегов или пробелов.

Пример:

<p v-if="user">Привет, {{ user.name }}</p>
<p v-else>Нет данных о пользователе</p>

v-else-if — Ветвление условий

Аналог else if в обычных языках программирования. Используется, когда есть несколько условий.

<template>
<div>
<p v-if="type === 'A'">Тип A</p>
<p v-else-if="type === 'B'">Тип B</p>
<p v-else>Неизвестный тип</p>
</div>
</template>

v-show — Альтернатива v-if с display: none

v-show не удаляет элемент из DOM, а просто меняет его CSS-свойство display. Это полезно, если элемент нужно часто скрывать/показывать без пересоздания.

Пример:

<p v-show="isVisible">Этот элемент просто скрывается</p>

Если isVisible — false, элемент остаётся в DOM, но становится невидимым через CSS.

Разница между v-if и v-show

Свойство v-if v-show
Вставка в DOM Удаляет/добавляет элемент Оставляет в DOM всегда
--- --- ---
Производительность Лучше при редких изменениях Лучше при частых переключениях
--- --- ---
Использует Условный рендеринг (реальный DOM) CSS (display: none)
--- --- ---

Если нужно переключать что-то часто (например, табы, модальные окна) — лучше использовать v-show. Если условие изменяется редко или элемент должен быть полностью уничтожен — v-if.

Условный рендеринг компонентов

Можно использовать условный рендеринг и для компонентов:

<ChildComponent v-if="shouldRender" />

Компонент будет создан только если shouldRender равен true.

Использование с computed / methods

Можно использовать вычисляемые свойства или методы в v-if:

<p v-if="isAdult">Доступ разрешён</p>
computed: {
isAdult() {
return this.age >= 18
}
}

Или даже методы:

<p v-if="hasPermission('admin')">Доступ администратора</p>

Комбинирование с template (без обёртки)

Если не хочется добавлять лишние теги в DOM, можно использовать директиву v-if на template. Сам template не будет отображён в DOM.

Пример:

<template v-if="error">
<p>Произошла ошибка</p>
<button @click="retry">Повторить</button>
</template>

В этом случае и <p>, и <button> появятся/исчезнут вместе, без лишнего оборачивания в <div>.

Использование с v-for и v-if вместе

Важно понимать, как работают эти директивы в сочетании:

&lt;li v-for="item in items" v-if="item.visible"&gt;{{ item.name }}&lt;/li&gt;

Такой подход работает, но неэффективен. Лучше использовать фильтрацию заранее:

computed: {
visibleItems() {
return this.items.filter(item => item.visible)
}
}

И затем:

&lt;li v-for="item in visibleItems"&gt;{{ item.name }}&lt;/li&gt;

Так вы уменьшаете нагрузку на виртуальный DOM и упрощаете отладку.

Пример с авторизацией

&lt;template&gt;
&lt;div&gt;
&lt;AdminPanel v-if="user.role === 'admin'" /&gt;
&lt;UserPanel v-else-if="user.role === 'user'" /&gt;
&lt;p v-else&gt;Доступ запрещён&lt;/p&gt;
&lt;/div&gt;
&lt;/template&gt;

Динамические классы с v-show

Можно объединять v-show с динамическими классами для управления анимацией или визуальными эффектами:

&lt;div v-show="isExpanded" :class="{ active: isExpanded }"&gt;Контент&lt;/div&gt;

Условная вставка через JSX/рендер-функции

Если используется render-функция вместо шаблонов, то условный рендеринг выполняется через обычные конструкции JavaScript:

render(h) {
return this.visible ? h('p', 'Привет') : null
}

Примеры реального использования

Прелоадер:

&lt;template&gt;
&lt;div&gt;
&lt;Loader v-if="isLoading" /&gt;
&lt;MainContent v-else /&gt;
&lt;/div&gt;
&lt;/template&gt;

Ошибка или контент:

&lt;template&gt;
&lt;template v-if="error"&gt;
&lt;ErrorMessage :text="error" /&gt;
&lt;/template&gt;
&lt;template v-else&gt;
&lt;DataTable :data="items" /&gt;
&lt;/template&gt;
&lt;/template&gt;

Условный рендеринг — один из фундаментальных инструментов Vue, позволяющий создавать динамические, отзывчивые и адаптивные интерфейсы. Правильный выбор между v-if и v-show, комбинирование с v-for, использование template и вычисляемых свойств — всё это даёт гибкость и контроль над рендерингом.