Для условного отображения нескольких элементов или компонентов Vue предоставляет несколько подходов. Рассмотрим их все с примерами и рекомендациями.
Наиболее распространенный способ для группового условного рендеринга:
<template v-if="isGroupVisible">
<div>Элемент 1</div>
<div>Элемент 2</div>
<component-a></component-a>
<component-b></component-b>
</template>
Особенности:
<template>
не создает дополнительного DOM-элементаv-else
и v-else-if
Если нужно сохранять элементы в DOM:
<div v-show="isVisible">
<div>Элемент 1</div>
<div>Элемент 2</div>
</div>
Когда использовать:
Создание специализированного компонента-обертки:
<conditional-group :show="shouldShow">
<div>Элемент 1</div>
<div>Элемент 2</div>
</conditional-group>
Реализация компонента:
Vue.component('conditional-group', {
props: ['show'],
render(h) {
return this.show ? h('div', this.$slots.default) : null
}
})
Для условного отображения одного из нескольких компонентов:
<component :is="currentComponent"></component>
<template v-for="item in items">
<div v-if="item.isVisible" :key="item.id">
{{ item.content }}
</div>
</template>
Важно: Не используйте v-if
и v-for
на одном элементе!
Для сложной логики рендеринга:
render(h) {
return this.shouldRender ? h('div', [
h('child-component-a'),
h('child-component-b')
]) : null
}
Подход | Плюсы | Минусы |
---|---|---|
<template> с v-if | Чистый DOM, нет обертки | Полный ререндер |
v-show на обертке | Быстрое переключение | Элементы остаются в DOM |
Компонент-обертка | Переиспользование логики | Дополнительный компонент |
Render-функции | Максимальная гибкость | Сложный синтаксис |
<template v-if="formType === 'advanced'">
<input placeholder="Field 1">
<input placeholder="Field 2">
<select>
<option>Advanced option</option>
</select>
</template>
<div v-if="isLoading" class="loader-group">
<spinner-component></spinner-component>
<p>Loading data...</p>
</div>
<template v-if="$breakpoints.isMobile">
<mobile-header></mobile-header>
<mobile-menu></mobile-menu>
</template>
<template v-else>
<desktop-header></desktop-header>
<sidebar-menu></sidebar-menu>
</template>
v-show
v-if
key
для принудительного ререндера Vue.js предлагает гибкие инструменты для условного рендеринга групп элементов. Выбор конкретного подхода зависит от требований к производительности, необходимости сохранять состояние и частоты переключений. Для большинства случаев оптимально использование <template>
с v-if
или v-show
.