\n```\n\n**Характеристики v-if:**\n- Полностью **удаляет элемент из DOM** если условие false\n- При true **добавляет элемент обратно** в DOM\n- **Пересчитывает компонент** при переключении\n- Все обработчики событий и дочерние компоненты переинициализируются\n- Более дорого при частом переключении\n\n### v-show — управление видимостью CSS\n\n**v-show** просто **скрывает элемент через CSS** (`display: none`), но он остается в DOM:\n\n```vue\n\n\n\n```\n\n**Характеристики v-show:**\n- Элемент всегда остается в DOM\n- **Переключает CSS свойство** `display` (none / block)\n- Не переинициализирует компонент\n- Все обработчики событий остаются активными\n- Быстрее при частом переключении\n\n### Таблица сравнения\n\n```\n v-if v-show\n─────────────────────────────────────────────────────\nДействие Добавляет/удаляет Скрывает через CSS\n элемент из DOM (display: none)\nВ DOM Нет, если false Всегда присутствует\nПереинициализация Да, при переключении Нет\nОбработчики событий Удаляются/создаются Остаются активными\nЛайфцикл компонента Полный цикл Не запускается\nПроизводительность Лучше при редком Лучше при частом\n переключении переключении\nЛенивая загрузка Да (нет рендера) Нет (всегда рендер)\nУсловные else/else-if Поддерживает Не поддерживает\n─────────────────────────────────────────────────────\n```\n\n### Пример различия в действии\n\n```vue\n\n\n\n```\n\n**При переключении:**\n- **v-if**: Input удаляется из DOM, значение `inputValue` теряется\n- **v-show**: Input скрывается, но значение `inputValue2` сохраняется\n\n### Практические примеры\n\n**1. Редкое переключение — используй v-if**\n```vue\n\n
\n \n
\n```\n\n**2. Частое переключение — используй v-show**\n```vue\n\n\n```\n\n**3. Условные блоки — используй v-if**\n```vue\n
\n
\n Loading...\n
\n
\n Success!\n
\n
\n Error occurred\n
\n
\n```\n\n### Условные директивы с v-if\n\n**v-if поддерживает v-else-if и v-else:**\n```vue\n
= 90\">Grade A
\n
= 80\">Grade B
\n
= 70\">Grade C
\n
Grade F
\n\n\n```\n\n### Производительность\n\n```vue\n\n\n```\n\n### Lifecycle с v-if\n\n```vue\n\n\n\n```\n\n### Рекомендации\n\n**Используй v-if когда:**\n- Условие редко меняется\n- Нужны v-else / v-else-if\n- Нужна ленивая загрузка\n- Компонент дорогой в рендере\n- Нужно сэкономить память (удаление из DOM)\n\n**Используй v-show когда:**\n- Часто переключается видимость\n- Нужно сохранить состояние компонента\n- Простое скрытие элемента\n- Нужна максимальная производительность\n\n### Итог\n\n**v-if** и **v-show** имеют разные варианты использования. Выбор между ними зависит от частоты переключения и требований вашего приложения. Быстрое правило: если переключаешь часто → v-show, если редко → v-if.","dateCreated":"2026-03-26T18:26:42.307012","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

В чем разница между v-show и v-if?

1.0 Junior🔥 161 комментариев
#Vue.js

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между v-show и v-if в Vue.js

v-show и v-if — это два основных способа управления видимостью элементов в Vue.js. Хотя результат выглядит одинаково (элемент видимый или скрытый), механизм работы кардинально отличается, что влияет на производительность и функциональность.

v-if — условное рендерирование

v-if полностью удаляет или добавляет элемент в DOM в зависимости от условия:

<template>
  <div>
    <button @click="showContent = !showContent">
      Toggle Content
    </button>
    
    <!-- Элемент полностью удаляется из DOM, когда showContent = false -->
    <div v-if="showContent" class="content">
      <p>Содержимое видно</p>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return { showContent: true };
  }
};
</script>

Характеристики v-if:

  • Полностью удаляет элемент из DOM если условие false
  • При true добавляет элемент обратно в DOM
  • Пересчитывает компонент при переключении
  • Все обработчики событий и дочерние компоненты переинициализируются
  • Более дорого при частом переключении

v-show — управление видимостью CSS

v-show просто скрывает элемент через CSS (display: none), но он остается в DOM:

<template>
  <div>
    <button @click="showContent = !showContent">
      Toggle Content
    </button>
    
    <!-- Элемент всегда в DOM, просто скрыт через display: none -->
    <div v-show="showContent" class="content">
      <p>Содержимое видно</p>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return { showContent: true };
  }
};
</script>

Характеристики v-show:

  • Элемент всегда остается в DOM
  • Переключает CSS свойство display (none / block)
  • Не переинициализирует компонент
  • Все обработчики событий остаются активными
  • Быстрее при частом переключении

Таблица сравнения

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

Пример различия в действии

<template>
  <div>
    <button @click="toggle">Toggle</button>
    
    <!-- v-if: элемент удаляется из DOM -->
    <div v-if="isVisible" class="box">
      <input v-model="inputValue" placeholder="Введи текст" />
      <p>{{ inputValue }}</p>
    </div>
    
    <!-- v-show: элемент скрыт, но в DOM остается -->
    <div v-show="isVisible" class="box">
      <input v-model="inputValue2" placeholder="Введи текст" />
      <p>{{ inputValue2 }}</p>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isVisible: true,
      inputValue: '',
      inputValue2: ''
    };
  },
  methods: {
    toggle() {
      this.isVisible = !this.isVisible;
    }
  }
};
</script>

При переключении:

  • v-if: Input удаляется из DOM, значение inputValue теряется
  • v-show: Input скрывается, но значение inputValue2 сохраняется

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

1. Редкое переключение — используй v-if

<!-- Модальное окно - редко переключается -->
<div v-if="showModal" class="modal">
  <ModalContent @close="showModal = false" />
</div>

2. Частое переключение — используй v-show

<!-- Меню навигации - часто переключается -->
<nav v-show="isMenuOpen" class="menu">
  <!-- Содержимое меню -->
</nav>

3. Условные блоки — используй v-if

<div>
  <div v-if="status === 'loading'">
    Loading...
  </div>
  <div v-else-if="status === 'success'">
    Success!
  </div>
  <div v-else>
    Error occurred
  </div>
</div>

Условные директивы с v-if

v-if поддерживает v-else-if и v-else:

<div v-if="score >= 90">Grade A</div>
<div v-else-if="score >= 80">Grade B</div>
<div v-else-if="score >= 70">Grade C</div>
<div v-else>Grade F</div>

<!-- v-show НЕ поддерживает v-else! -->

Производительность

<!-- Частое переключение - v-show быстрее -->
<template>
  <div>
    <button @click="toggleFast">Toggle (1000 раз за секунду)</button>
    
    <!-- v-if = много создания/удаления элементов = медленно -->
    <div v-if="showFast">Content</div>
    
    <!-- v-show = просто toggle CSS = быстро -->
    <div v-show="showFast">Content</div>
  </div>
</template>

Lifecycle с v-if

<script>
export default {
  components: {
    Child: {
      mounted() { console.log('Child mounted'); },
      unmounted() { console.log('Child unmounted'); }
    }
  }
};
</script>

<template>
  <!-- При toggle: mounted/unmounted вызываются для Child -->
  <Child v-if="isVisible" />
  
  <!-- При toggle: mounted/unmounted НЕ вызываются -->
  <Child v-show="isVisible" />
</template>

Рекомендации

Используй v-if когда:

  • Условие редко меняется
  • Нужны v-else / v-else-if
  • Нужна ленивая загрузка
  • Компонент дорогой в рендере
  • Нужно сэкономить память (удаление из DOM)

Используй v-show когда:

  • Часто переключается видимость
  • Нужно сохранить состояние компонента
  • Простое скрытие элемента
  • Нужна максимальная производительность

Итог

v-if и v-show имеют разные варианты использования. Выбор между ними зависит от частоты переключения и требований вашего приложения. Быстрое правило: если переключаешь часто → v-show, если редко → v-if.