Хотя обе директивы управляют видимостью элементов, они работают принципиально по-разному. Вот детальное сравнение:
<div v-if="condition">v-if content</div>
<div v-show="condition">v-show content</div>
false и создает заново при truedisplay: none/blockdata() {
return { isActive: false }
}
falsecreated, mounted) не вызываются| Сценарий | v-if | v-show |
|---|---|---|
| Первый рендер | Быстрее (если false) | Медленнее (всегда рендерит) |
| Частые переключения | Медленнее (пересоздание DOM) | Быстрее (только CSS) |
| Сложный контент | Эффективнее для редко показываемых элементов | Лучше для частых переключений |
<admin-panel v-if="user.isAdmin"/>
<data-visualization v-if="showChart"/> <!-- Не загружать если не нужно -->
<template v-if="Array.isArray(data) && data.length > 0">
<!-- контент -->
</template>
<mobile-menu v-show="isMobileView"/>
<div v-show="isLoading" class="loader"></div>
<input v-show="isEditing" v-model="text"> <!-- Сохраняет значение при скрытии -->
<transition><transition name="fade">
<div v-if="show">Content</div>
</transition>
false refs становятся undefined<child-component v-if="false"/> <!-- Хуки жизненного цикла не вызываются -->
<child-component v-show="false"/> <!-- Все хуки выполняются -->
<div v-if="false" style="display: none"> <!-- Аналог v-show но без реактивности -->
<template v-if="hasData">
<chart-component v-show="isChartVisible"/>
</template>
Выбор между v-if и v-show зависит от конкретного сценария. v-if предпочтителен для редко используемых или "тяжелых" компонентов, тогда как v-show лучше подходит для частых переключений видимости. Понимание этих различий позволяет писать более эффективные Vue-приложения.