Это вторая статья о перспективном фреймворке Alpine.js.
Первую можно прочитать по ссылке:
Alpine.js — легковесный фреймворк с удобным синтаксисом
Продолжаем знакомить сообщество с этим замечательным инструментом.
Полный код урока здесь.
X-SHOW и X-CLOAK
<div x-data="{ show: false }">
<button x-on:click="show= ! show" x-text="show ? 'Скрыть' : 'Показать' ">
</button>
<p x-show="show" x-cloak>Привет!</p>
</div>
В примере выше разберем сразу две новые директивы. X-show хоть и похожа по применению с x-if, но не стоит их путать. X-show не меняет древо страницы, а только управляет свойством display у элемента. То есть элемент будет отрендерен, но не показан.
X-cloak это директива, которая удаляется сразу после инициации скрипта. Казалось бы, какой в ней толк? Рассмотрим практическое применение. Когда мы запускаем код выше, на какое-то мгновение мы видим элемент с текстом «Привет!», несмотря на значение false в директиве x-show. Тут нам на помощь приходит x-cloak, нужно только прописать ему следующий стиль:
[x-cloak] {
display: none;
}
Теперь элемент будет скрыт до начала работы скрипта.
Внезапное появление и исчезновение элемента не очень наглядно, поэтому для анимации этих событий используется модификатор .transition.
X-SHOW.TRANSITION
Улучшим предыдущий код с помощью модификаторов:
<div x-data="{ show: false }">
<button x-on:click="show= ! show" x-text="show ? 'Скрыть': 'Показать' ">
</button>
<p x-show="show"> NO TRANSITION</p>
<p x-show.transition="show">TRANSITION</p>
<p x-show.transition.in.duration.1000ms="show">TRANSITION IN</p>
<p x-show.transition.out.duration.1000ms="show">TRANSITION OUT</p>
<p x-show.transition.scale.05.duration.1000ms="show">TRANSITION Scale</p>
<p x-show.transition.opacity.in.duration.1000ms="show">TRANSITION Opacity</p>
<p x-show.transition.in.duration.1000ms.out.duration.500ms="show">TRANSITION IN Duration</p>
</div>
Разные вариации использования мы расположили друг под другом и увеличили время действия до 1 секунды с помощью цепочки модификаторов .in.duration.1000ms
По умолчанию transition (без других модификаторов) использует для анимации свойства opacity и scale ( scale: 0.95), временную функцию cubic-bezier(0.4, 0.0, 0.2, 1), 150 миллисекунд для анимации появления и 75 для исчезновения. Эти изменения малозаметны для глаза, поэтому для наглядности мы удлинили действие последующих скриптов.
Дополнительные модификаторы позволяют разнообразить и подчеркнуть работу анимации:
- .in позволяет установить только анимацию появления;
- .out — для анимации исчезновения;
- .scale — изменение в размерах элемента;
- .opacity — для анимации прозрачности;
- .duration задает продолжительность в миллисекундах.
Для анимации появления и исчезновения элемента с директивой x-if используется специальная директива x-transition. Она предоставляет еще более гибкий функционал и работает также и на x-show. Её мы рассмотрим в следующий раз. Для нетерпеливых есть ссылка .
X-INIT
X-init — директива, получающая блок кода, который вы хотите выполнить во время инициации компонента. Похожа на использование created во Vue.js. Основное применение это вычисление начальных значений в x-data. Рассмотрим ее на примере:
<div
x-data="{ posts: [] }"
x-init="
fetch('https://jsonplaceholder.typicode.com/albums/1/photos')
.then((response) => {
return response.json();
})
.then((data) => {
posts = data
});
"
>
<template x-for="post in posts" :key="post.id">
<div class="post">
<h1 x-text="post.title"></h1>
<img :src="post.thumbnailUrl" :alt="post.title" />
</div>
</template>
<hr/>
</div>
В x-data у нас есть объект posts, который по умолчанию не содержит ничего. В директиве x-init мы получаем данные с сервера с помощью функции fetch и после преобразования в json-формат присваиваем нашему объекту. Потом с помощью x-for можно отобразить полученные «посты» на странице.
X-REF и $REFS
Эта директива предоставляет доступ к нужному элементу в любой части страницы, в том числе и вне компонента. Все ссылки становятся доступными через глобальное поле $refs. Продемонстрируем эту возможность на примере:
<div x-data="{ }">
<input type="text" x-ref="myInput"/>
<button x-on:click="alert($refs.myInput.value)">Alert</button>
<hr />
</div>
Текст введенный в input с атрибутом x-ref=«myInput» будет доступен в $refs.myInput.value
На этом наш сегодняшний урок закончен. Все примеры урока здесь.
Всем удачных проектов и до скорых встреч!