Работа с условиями в фреймворке Vue
Следующая директива, которую мы изучим, называется v-if. С ее помощью можно показывать или скрывать элементы. Как эта директива работает: параметром она принимает любое свойство объекта data. Если это свойство имеет значение true - то элемент будет показан, а если false - то скрыт.
Давайте посмотрим на примере.
Пусть у нас есть абзац с атрибутом v-if. Значением этого атрибута пусть служит свойство show, вот так:
<div id="app">
<p v-if="show">hello</p>
</div>
Получается, что этот абзац будет показан, если show имеет значение true, и скрыт, если false.
Давайте установим значение нашего свойства в true:
let app = new Vue({
el: '#app',
data: {
show: true,
},
});
А теперь соберем все вместе и запустим - абзац будет показан:
let app = new Vue({
el: '#app',
data: {
show: true,
},
});
<div id="app">
<p v-if="show">hello</p>
</div>
А вот если show поставить в значение false, то абзац будет скрыт:
let app = new Vue({
el: '#app',
data: {
show: false,
},
});
<div id="app">
<p v-if="show">hello</p>
</div>
Можно инвертировать условие с помощью восклицательного знака:
<div id="app">
<p v-if="!show">hello</p>
</div>
В таком случае абзац будет показан, если show имеет значение false и скрыт - если true.
Прячем по нажатию
Давайте сделаем так, чтобы элемент спрятался по нажатию на кнопку.
Пусть к директиве v-if привязано свойство show:
<div id="app">
<p v-if="show">hello</p>
</div>
Пусть изначально в свойстве show будет true (то есть наш абзац будет показан, а не скрыт):
data: {
show: true,
}
Добавим еще кнопку, ко клику на которую будет вызываться метод hideElem:
<div id="app">
<button v-on:click="hideElem">Спрятать</button>
<p v-if="show">hello</p>
</div>
Этот метод будет менять свойство show на false, тем самым заставляя наш абзац скрыться:
methods: {
hideElem: function() {
this.show = false;
}
}
Давайте соберем все вместе и запустим:
let app = new Vue({
el: '#app',
data: {
show: true,
},
methods: {
hideElem: function() {
this.show = false;
}
}
});
<div id="app">
<button v-on:click="hideElem">Спрятать</button>
<p v-if="show">hello</p>
</div>
Если вы запустите этот код и нажмете на кнопку - абзац скроется. Аналогичным образом можно реализовать и показ абзаца обратно.
Показ и скрытие
Давайте теперь по первому клику на кнопку будем показывать абзац, а по второму клику на эту же кнопку - прятать. Для этого метод hideElem переименуем на toggleElem в соответствии с его новыми обязанностями:
<div id="app">
<button v-on:click="toggleElem">Нажми</button>
<p v-if="show">hello</p>
</div>
А в самом методе в this.show запишем то, что сейчас хранится в this.show, но с противоположным значением, вот так - !this.show.
Как это будет работать: если в this.show сейчас true, то команда !this.show превратит его в false и наоборот.
Реализуем:
toggleElem: function() {
this.show = !this.show;
}
Соберем все вместе и запустим:
let app = new Vue({
el: '#app',
data: {
show: true,
},
methods: {
toggleElem: function() {
this.show = !this.show;
}
}
});
<div id="app">
<button v-on:click="toggleElem">Нажми</button>
<p v-if="show">hello</p>
</div>
Теперь по нажатию на кнопку элемент будет то скрываться, то показываться. Проверьте.
Добавим тернарный оператор
Не очень удобно то, что в кнопочке сейчас всегда написан текст 'Нажми'. Давайте сделаем так, чтобы там чередовались слова 'Скрыть' и 'Показать' в зависимости от следующего действия.
Для этого нам необходимо использовать тернарный оператор следующим образом:
<button v-on:click="toggleElem">
{{ show ? 'Скрыть' : 'Показать' }}
</button>
Это работает так: если свойство show имеет значение true, то следующее действие будет сокрытие элемента и мы покажем текст 'Скрыть', а если оно имеет значение false, то следующее действие будет показ элемента и мы покажем текст 'Показать'.
Давайте применим описанные изменения к нашему коду:
let app = new Vue({
el: '#app',
data: {
show: true,
},
methods: {
toggleElem: function() {
this.show = !this.show;
}
}
});
<div id="app">
<button v-on:click="toggleElem">
{{ show ? 'Скрыть' : 'Показать' }}
</button>
<p v-if="show">hello</p>
</div>
Директива v-else
Директива v-if может также работать в комплекте с v-else. Давайте посмотрим, как это выглядит на практике.
Пусть свойство show может принимать или true или false:
let app = new Vue({
el: '#app',
data: {
show: true, // тут или true, или false
},
});
Сделаем так, чтобы, если show равно true, то выводилось 'да', в противном случае - 'нет':
<div id="app">
<p v-if="show">да</p>
<p v-else>нет</p>
</div>
Учтите, что v-else обязательно должен идти в комплекте с v-if и элемент с v-else обязательно должен идти сразу после элемента с v-if.
Сложные условия
В директиве v-if можно делать не только свойства со значениями true или false, но и передавать более сложные условия.
Пусть, к примеру, в свойстве num может быть одно из чисел 1, 2 или 3:
let app = new Vue({
el: '#app',
data: {
num: 3, // пусть сейчас там 3
},
});
Давайте теперь сделаем 3 абзаца, из которых будет показан только один в зависимости от значения свойства num:
<div id="app">
<p v-if="num == 1">один</p>
<p v-if="num == 2">два</p>
<p v-if="num == 3">три</p>
</div>
Можно делать и более сложные условия, например, так (пусть тут age - какой-то возраст):
<div id="app">
<p v-if="age >= 1 && age <= 10">от 1 до 10</p>
<p v-if="age >= 11 && age <= 20">от 11 до 20</p>
</div>
Директива v-else-if
Вместо нескольких v-if можно использовать конструкции v-else-if:
<div id="app">
<p v-if="num == 1">один</p>
<p v-else-if="num == 2">два</p>
<p v-else-if="num == 3">три</p>
<p v-else>что-то другое</p>
</div>
Использование <template>
По следующей ссылке изучите раздел Условные группы с использованием v-if и <template>.
Директива v-show
По следующей ссылке изучите раздел v-show и раздел v-if в сравнении с v-show.
Директивы v-for и v-if
По следующей ссылке изучите раздел v-for и v-if.