<div x-data="{ placeholder: 'Введите текст...' }"> <input type="text" x-bind:placeholder="placeholder" /></div>
x-bind
x-bind
позволяет устанавливать HTML-атрибуты элементов на основе результата работы JavaScript-выражений.
Например, вот компонент, в котором мы будем использовать x-bind
для установки значения placeholder для текстового поля.
Сокращённый синтаксис
Если x-bind:
слишком многословен, то можно воспользоваться сокращением: :
. Например, здесь представлен тот же элемент input, что и выше, но переделанный для использования сокращённого синтаксиса.
<input type="text" :placeholder="placeholder" />
Привязка классов
x-bind
чаще всего используется для установки определённых классов для элемента в зависимости от состояния Alpine.
Вот пример простого выпадающего списка, но вместо x-show
мы используем класс hidden для переключения элемента.
<div x-data="{ open: false }"> <button x-on:click="open = !open">Переключить выпадающий список</button>
<div :class="open ? '' : 'hidden'">Содержимое списка...</div></div>
Теперь, когда open
имеет значение false
, класс hidden будет добавлен в выпадающий список.
Сокращённый синтаксис условий
В подобных случаях, если вы предпочитаете менее многословный синтаксис, вместо стандартных условий можно использовать сокращённый синтаксис JavaScript:
<div :class="show ? '' : 'hidden'"> <!-- Эквивалентно: --> <div :class="show || 'hidden'"></div></div>
Обратная ситуация также доступна. Предположим, что вместо open
мы используем переменную с противоположным значением: closed
.
<div :class="closed ? 'hidden' : ''"> <!-- Эквивалентно: --> <div :class="closed && 'hidden'"></div></div>
Объектный синтаксис классов
При желании Alpine предлагает дополнительный синтаксис для переключения классов. Передав объект JavaScript, в котором классы являются ключами, а булевы — значениями, Alpine будет знать, какие классы применять, а какие удалять. Например:
<div :class="{ 'hidden': ! show }"></div>
Эта методика имеет уникальное преимущество перед другими методами. При использовании объектного синтаксиса Alpine НЕ сохраняет оригинальные классы, примененные к атрибуту class
элемента.
Например, если вы хотите применить класс hidden к элементу до загрузки Alpine И использовать Alpine для переключения его существования, вы можете добиться такого поведения только с помощью объектного синтаксиса:
<div class="hidden" :class="{ 'hidden': ! show }"></div>
Если это вас смутило, давайте разберемся, как Alpine обрабатывает x-bind:class
иначе, чем другие атрибуты.
Особое поведение
x-bind:class
ведет себя иначе, чем другие атрибуты.
Рассмотрим следующий случай.
<div class="opacity-50" :class="hide && 'hidden'"></div>
Если бы class был любым другим атрибутом, привязка :class
перезаписала бы любой существующий атрибут класса, в результате чего opacity-50
был бы перезаписан либо hidden
, либо пустой строкой (''
).
Однако Alpine по-другому относится к привязкам классов. Достаточно разумно сохранить существующие классы элемента.
Например, если hide
имеет значение true, приведённый выше пример приведёт к следующему элементу DOM:
<div class="opacity-50 hidden"></div>
Если hide
имеет значение false
, элемент DOM будет выглядеть так:
<div class="opacity-50"></div>
Такое поведение должно быть невидимым и интуитивно понятным для большинства пользователей, но о нём стоит упомянуть явно для запрашивающего разработчика или для любых особых случаев, которые могут возникнуть.
Привязка стилей
Подобно специальному синтаксису для связывания классов с объектами JavaScript, Alpine также предлагает объектный синтаксис для привязки атрибутов style
.
Как и в случае с классами, этот синтаксис совершенно необязателен. Используйте его только в том случае, если это дает вам какое-то преимущество.
<div :style="{ color: 'red', display: 'flex' }"> <!-- Отрендерит как: --> <div style="color: red; display: flex;" ...></div></div>
Условное встроенное оформление возможно с использованием выражений, как и в случае с x-bind:class
. Здесь также можно использовать операторы короткого замыкания, используя объект стилей в качестве второго операнда.
<div x-bind:style="true && { color: 'red' }"> <!-- Отрендерит как: --> <div style="color: red;"></div></div>
Одним из преимуществ этого подхода является возможность смешивать его с существующими стилями элемента:
<div style="padding: 1rem;" :style="{ color: 'red', display: 'flex' }"> <!-- Отрендерит как: --> <div style="padding: 1rem; color: red; display: flex;" ...></div></div>
И, как и большинство выражений в Alpine, вы всегда можете использовать результат выражения JavaScript в качестве ссылки:
<div x-data="{ styles: { color: 'red', display: 'flex' }}"> <div :style="styles"></div>
<!-- Отрендерит как: --> <div ...> <div style="color: red; display: flex;" ...></div> </div></div>
Прямая привязка директив Alpine
x-bind
позволяет привязать к элементу объект из различных директив и атрибутов.
Ключи объектов могут быть любыми, которые обычно пишутся в Alpine в качестве имени атрибута. Сюда входят директивы и модификаторы Alpine, а также обычные атрибуты HTML. Значения объектов представляют собой либо обычные строки, либо, в случае динамических директив Alpine, обратные вызовы, которые должны быть вычислены Alpine.
<div x-data="dropdown"> <button x-bind="trigger">Открыть</button> <div x-bind="dialogue">Содержимое</div></div>
<script> document.addEventListener('alpine:init', () => { Alpine.data('dropdown', () => ({ open: false,
trigger: { ['x-ref']: 'trigger', ['@click']() { this.open = true; }, },
dialogue: { ['x-show']() { return this.open; }, ['@click.outside']() { this.open = false; }, }, })); });</script>
При таком использовании x-bind
есть несколько оговорок:
Проверка знаний
-
Как передать элементу
input
значение атрибутаrequired
?<div x-data="{ required: true }"><input type="text" /></div> -
Какой из блоков станет красным?