Хотя обе директивы управляют видимостью элементов, они работают принципиально по-разному. Вот детальное сравнение:
<div v-if="condition">v-if content</div>
<div v-show="condition">v-show content</div>
false
и создает заново при true
display: none/block
data() {
return { isActive: false }
}
false
created
, 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-приложения.