Как добиться условного рендеринга группы элементов или компонентов?vue-7

Для условного отображения нескольких элементов или компонентов Vue предоставляет несколько подходов. Рассмотрим их все с примерами и рекомендациями.

1. Использование <template> с v-if

Наиболее распространенный способ для группового условного рендеринга:

<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

2. Групповой v-show

Если нужно сохранять элементы в DOM:

<div v-show="isVisible">
  <div>Элемент 1</div>
  <div>Элемент 2</div>
</div>

Когда использовать:

  • Для частого переключения видимости
  • Когда нужно сохранить состояние компонентов

3. Компонент-обертка

Создание специализированного компонента-обертки:

<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
  }
})

4. Динамические компоненты

Для условного отображения одного из нескольких компонентов:

<component :is="currentComponent"></component>

5. Комбинация v-for и v-if

<template v-for="item in items">
  <div v-if="item.isVisible" :key="item.id">
    {{ item.content }}
  </div>
</template>

Важно: Не используйте v-if и v-for на одном элементе!

6. Render-функции

Для сложной логики рендеринга:

render(h) {
  return this.shouldRender ? h('div', [
    h('child-component-a'),
    h('child-component-b')
  ]) : null
}

Сравнение подходов

Подход Плюсы Минусы
<template> с v-if Чистый DOM, нет обертки Полный ререндер
v-show на обертке Быстрое переключение Элементы остаются в DOM
Компонент-обертка Переиспользование логики Дополнительный компонент
Render-функции Максимальная гибкость Сложный синтаксис

Практические примеры

1. Форма с условными полями

<template v-if="formType === 'advanced'">
  <input placeholder="Field 1">
  <input placeholder="Field 2">
  <select>
    <option>Advanced option</option>
  </select>
</template>

2. Спиннер загрузки

<div v-if="isLoading" class="loader-group">
  <spinner-component></spinner-component>
  <p>Loading data...</p>
</div>

3. Адаптивный интерфейс

<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>

Оптимизация производительности

  1. Для часто переключаемых групп используйте v-show
  2. Для тяжелых компонентов предпочитайте v-if
  3. Избегайте сложных условий в шаблонах - выносите в computed-свойства
  4. Используйте key для принудительного ререндера

Резюмируем:

Vue.js предлагает гибкие инструменты для условного рендеринга групп элементов. Выбор конкретного подхода зависит от требований к производительности, необходимости сохранять состояние и частоты переключений. Для большинства случаев оптимально использование <template> с v-if или v-show.