Хотите узнать Vue.js с нуля? Получите полную коллекцию книг Vue, охватывающих основы, проекты, советы и инструменты и многое другое с SitePoint Premium. Присоединяйтесь сейчас всего за $ 14,99 / месяц .
Есть моменты, когда вам нужно изменить классы CSS элемента во время выполнения. Но при смене классов иногда лучше применять детали стиля условно. Например, представьте, что в вашем представлении есть пейджер. Пейджеры часто используются для навигации по большим наборам предметов. При навигации может быть полезно показать пользователю страницу, на которой он находится в данный момент. Стиль элемента устанавливается условно, исходя из текущей просматриваемой страницы.
Пейджер в этом случае может выглядеть примерно так:
В этом примере есть пять страниц. Только одна из этих страниц выбрана за раз. Если вы создали этот пейджер с Bootstrap, на выбранной странице будет применен класс CSS с именем active
Вы хотите, чтобы этот класс применялся, только если страница была просматриваемой в данный момент страницей. Другими словами, вы хотите условно применить active
К счастью, Vue предоставляет способ условного применения класса CSS к элементу, который я собираюсь продемонстрировать в этой статье.
Чтобы условно применить класс CSS во время выполнения, вы можете привязать его к объекту JavaScript. Чтобы успешно выполнить эту задачу, вы должны выполнить два шага. Во-первых, вы должны убедиться, что ваш класс CSS определен. Затем вы создаете привязки классов в своем шаблоне. Я собираюсь объяснить каждый из этих шагов подробно в остальной части этой статьи.
Шаг 1: Определите ваши CSS классы
Представьте на мгновение, что пять элементов страницы, показанных на рисунке выше, были определены с использованием следующего HTML:
<div id="myApp">
<nav aria-label="Page navigation example">
<ul class="pagination">
<li class="page-item"><a class="page-link" href="#">1</a></li>
<li class="page-item"><a class="page-link" href="#">2</a></li>
<li class="page-item active"><a class="page-link" href="#">3</a></li>
<li class="page-item"><a class="page-link" href="#">4</a></li>
<li class="page-item"><a class="page-link" href="#">5</a></li>
</ul>
</nav>
</div>
Обратите внимание, что каждая страница в этом фрагменте кода имеет элемент list-item ( <li …
Этот элемент ссылается на класс CSS элемента page-item
В коде этой статьи этот класс определен в среде Bootstrap CSS. Однако, если бы он не был определен там, вы должны убедиться, что он где-то определен. Второй класс CSS — это тот, который наиболее актуален для этой статьи.
active
Для этой статьи этот класс CSS также определен в Bootstrap CSS. Как показано во фрагменте выше, active
третьем элементе списка. Как вы можете догадаться, это класс CSS, который вы хотите применить условно. Для этого вам нужно добавить объект JavaScript.
Шаг 2. Создайте привязки классов
Давайте создадим фрагмент кода, показанный на шаге 1. При создании привязок классов в вашем шаблоне существует два основных варианта: использование синтаксиса объекта или использование синтаксиса массива. Я собираюсь показать вам, как использовать оба подхода в оставшейся части этой статьи.
Связывание с использованием синтаксиса объекта
Чтобы создать привязку класса с использованием синтаксиса объекта, вы должны использовать выражение JavaScript. Выражение, которое мы будем использовать, можно увидеть в коде, связанном с этой статьей здесь . Этот соответствующий код выглядит так:
<div id="myApp">
<nav aria-label="An example with pagination">
<ul class="pagination">
<li v-for="page in totalPages" v-bind:class="{'page-item':true, 'active':(page === currentPage)}">
<a class="page-link" href="#">{{ page }}</a>
</li>
</ul>
</nav>
</div>
Я сократил объем кода с помощью директивы vue v-for
Эта директива используется для визуализации элементов в цикле. Элементы в этом примере — сами страницы. Помимо использования директивы v-for
v-bind
Директива v-bind
class
Этот экземпляр Vue определяется следующим образом:
var app = new Vue({
el: '#myApp',
data: {
totalPages: 5,
currentPage: 3
}
});
Этот экземпляр Vue прямо в точку. Приведенный выше объект data
currentPage
Если вы вернетесь к шаблону HTML, определенному выше, вы заметите, что на это свойство ссылаются. Фактически, объект JavaScript, связанный с каждой привязкой класса, выглядит примерно так:
{'page-item':true, 'active':(page === currentPage)}
Этот объект определяет два свойства: page-item
active
В частности, это имена двух классов CSS, которые обсуждались на шаге 1. На шаге 2 эти две ссылки на классы стали именами свойств в объекте JavaScript. Значения, связанные с этими именами свойств, являются выражениями JavaScript. Если выражение оценивается как правдивое, класс CSS будет включен. Если выражение оценивается как false
не будет включен. Имея в виду эти правила, давайте рассмотрим каждое свойство.
Первое свойство page-item
true
Это жестко запрограммированное значение используется, потому что мы всегда хотим включить класс page-item
Второе свойство, active
Когда это выражение true
active
Это дает нам возможность условно применять active
currentPage
Другой способ условно применить active
Array
Связывание с использованием синтаксиса массива
Vue позволяет применять список классов CSS путем привязки к Array
Если вы хотите использовать синтаксис Array
<div id="myApp">
<nav aria-label="An example with pagination">
<ul class="pagination">
<li v-for="page in totalPages" v-bind:class="[pageItemClass, (page === currentPage) ? activeClass : '']">
<a class="page-link" href="#">{{ page }}</a>
</li>
</ul>
</nav>
</div>
Работающую версию с синтаксисом Array
здесь . Единственное отличие — использование Array
Этот альтернативный подход предполагает наличие двух дополнительных свойств в объекте data
Эти два свойства: pageItemClass
activeClass
Обновленный код инициализации Vue с этими свойствами выглядит следующим образом:
var app = new Vue({
el: '#myApp',
data: {
totalPages: 5,
currentPage: 3,
pageItemClass: 'page-item',
activeClass: 'active'
}
});
Как вы можете видеть, объект data
Array
Синтаксис объекта немного более компактен. Выбор между синтаксисом объекта и синтаксисом Array
Может показаться, что оба подхода усложняют ваш HTML-шаблон. Тем не менее, здесь на самом деле происходит больше. В действительности мы разделяем проблемы. Мы создаем шаблон, основанный на данных. Это облегчает тестирование представления и его поддержку по мере роста приложения.
Заворачивать
Я надеюсь, что вы нашли эту статью ценным. Если вы хотите узнать больше о Vue.js, почему бы не проверить некоторые другие наши материалы Vue здесь, на SitePoint. В противном случае, вы можете найти меня в Twitter @chadcampbell . Еще раз спасибо!