v-ifДиректива v-if используется для отрисовки блока по условию. Блок будет отображаться только в том случае, если выражение директивы возвращает значение, приводимое к true.
<h1 v-if="awesome">Vue восхитителен!</h1>
Также можно добавить блок «иначе», используя директиву v-else:
<h1 v-if="awesome">Vue восхитителен!</h1>
<h1 v-else>О, нет 😢</h1>
v-if и <template>Поскольку v-if — директива, она должна быть указана в одном конкретном теге. Но что если мы хотим управлять отображением сразу нескольких элементов? В таком случае можно применить v-if к псевдоэлементу <template>, который служит невидимой обёрткой и сам в результатах отрисовки не появляется.
<template v-if="ага">
<h1>Заголовок</h1>
<p>Абзац 1</p>
<p>Абзац 2</p>
</template>
v-elseДля указания блока «иначе» для v-if можно использовать директиву v-else:
<div v-if="Math.random() > 0.5">
Сейчас меня видно
</div>
<div v-else>
А теперь — нет
</div>
Элемент с директивой v-else должен следовать сразу за элементом с директивой v-if или v-else-if, иначе он не будет распознан.
v-else-ifДобавлено в версии 2.1.0+
Как следует из названия, v-else-if служит в качестве блока «else if» для директивы v-if. Можно объединять эти директивы в длинные цепочки:
<div v-if="type === 'A'">
A
</div>
<div v-else-if="type === 'B'">
B
</div>
<div v-else-if="type === 'C'">
C
</div>
<div v-else>
Не A/B/C
</div>
Как и v-else, v-else-if должен следовать сразу за элементом с v-if или v-else-if.
keyVue старается управлять элементами DOM настолько эффективно, насколько это возможно, зачастую переиспользуя их вместо того чтобы создавать заново. Кроме улучшения производительности, у этого подхода есть и другие преимущества. Например, если вы позволяете пользователю переключаться между несколькими возможными типами входа.
<template v-if="loginType === 'username'">
<label>Имя пользователя</label>
<input placeholder="Введите имя пользователя">
</template>
<template v-else>
<label>Email</label>
<input placeholder="Введите адрес email">
</template>
Изменение loginType в коде выше не сотрёт то, что пользователь ввёл в поле. Оба шаблона используют одни и те же элементы, поэтому <input> не заменяется — только его placeholder.
Иногда такое поведение нежелательно, поэтому Vue можно явно указать: «эти элементы должны быть полностью независимы, не надо их переиспользовать». Для этого всего лишь нужно указать уникальное значение ключа key:
<template v-if="loginType === 'username'">
<label>Имя пользователя</label>
<input placeholder="Введите имя пользователя" key="username-input">
</template>
<template v-else>
<label>Email</label>
<input placeholder="Введите адрес email" key="email-input">
</template>
Теперь эти поля ввода будут отрисовываться заново при каждом переключении:
Обратите внимание, элементы <label> всё ещё эффективно переиспользуются, поскольку для них key не указаны.
v-showЕщё одну возможность условного отображения предоставляет директива v-show. Используется она так же:
<h1 v-show="ага">Привет!</h1>
Разница в том, что элемент с v-show будет всегда оставаться в DOM, а изменяться будет лишь свойство display в его параметрах CSS.
v-show не работает на элементе <template> и не работает с v-else.
v-if в сравнении с v-showv-if производит «настоящую» условную отрисовку, удостоверяясь что подписчики событий и дочерние компоненты внутри блока должным образом уничтожаются и воссоздаются при изменении истинности управляющего условия.
v-if ленивый: если условие ложно на момент первоначальной отрисовки, он не произведёт никаких действий — условный блок не будет отображён, пока условие не станет истинным.
v-show, напротив, куда проще: элемент всегда присутствует в DOM, и только CSS-свойство переключается в зависимости от условия.
В целом, у v-if выше затраты на переключения, а у v-show больше затрат на первичную отрисовку. Так что если вы предполагаете, что переключения будут частыми, используйте v-show, если же редкими или маловероятными — v-if.
v-if вместе с v-forСовместное использование v-if и v-for не рекомендуется. Подробнее можно изучить в разделе рекомендаций.
При совместном использовании v-if и v-for, директива v-for имеет более высокий приоритет. Подробнее на странице отрисовки списков.