v-skeleton-loader в библиотеке Vuetify
предоставляет возможность создавать заполнительные
скелетоны, которые визуально имитируют загрузку контента. Этот
компонент особенно полезен для улучшения UX при асинхронной подгрузке
данных.
Базовый синтаксис компонента:
<v-skeleton-loader type="text" />
Здесь type определяет стандартный вид скелетона.
Доступные варианты: text, avatar,
image, card, list-item,
paragraph, heading.
Ключевые свойства:
loading — логическое значение. Если true,
компонент отображает скелетон, если false, показывается
реальный контент.type — строка или массив строк с предопределёнными
типами скелетона.width и height — позволяют задать размеры
скелетона вручную.color — задаёт цвет скелетона.tile — логическое значение, если true,
углы скелетона становятся прямыми, без скруглений.elevation — добавляет тень к скелетону, аналогично
карточкам Vuetify.Пример использования с кастомными размерами:
<v-skeleton-loader
type="image"
width="300"
height="200"
/>
Скелетоны могут комбинироваться для имитации сложного интерфейса, например карточки пользователя с аватаром и текстом:
<v-skeleton-loader type="card">
<template #default>
<v-skeleton-loader type="avatar" class="mb-2" />
<v-skeleton-loader type="heading" class="mb-1" />
<v-skeleton-loader type="text" />
</template>
</v-skeleton-loader>
В данном примере используется слот default, позволяющий
вставлять несколько скелетонов внутри одной структуры. Комбинация типов
создаёт визуальный эффект полноценной карточки, которая ещё не
загружена.
Анимация скелетона по умолчанию представлена плавным
пульсирующим эффектом. Она может быть отключена через
loading или изменена через свойство type.
<v-skeleton-loader
type="text"
:loading="true"
class="skeleton-pulse"
/>
Для более точной настройки можно использовать CSS-переменные Vuetify:
.skeleton-pulse {
--v-skeleton-loader-background: #e0e0e0;
--v-skeleton-loader-highlight: #f5f5f5;
}
Цвета и градиенты позволяют адаптировать скелетоны под общий стиль приложения.
Использование v-skeleton-loader вместе с асинхронными
вызовами данных делает интерфейс более отзывчивым. Пример с
v-if:
<template>
<div>
<v-skeleton-loader v-if="loading" type="list-item" />
<v-list v-else>
<v-list-item v-for="item in items" :key="item.id">
{{ item.name }}
</v-list-item>
</v-list>
</div>
</template>
<script>
export default {
data() {
return {
loading: true,
items: [],
};
},
mounted() {
setTimeout(() => {
this.items = [
{ id: 1, name: 'Первый элемент' },
{ id: 2, name: 'Второй элемент' },
];
this.loading = false;
}, 2000);
},
};
</script>
В этом примере скелетоны отображаются до момента завершения асинхронной загрузки данных, а затем заменяются реальным списком.
Для создания уникальных интерфейсов можно передавать массив типов:
<v-skeleton-loader :type="['avatar', 'heading', 'text']" />
Такой подход позволяет формировать скелетоны для сложных компонентов, включая карточки товаров, профили пользователей и посты блога.
Слоты открывают возможность создавать собственные структуры скелетона, не ограничиваясь стандартными типами. Пример скелетона карточки продукта:
<v-skeleton-loader>
<template #default>
<v-skeleton-loader type="image" height="180" />
<v-skeleton-loader type="heading" />
<v-skeleton-loader type="text" />
<v-skeleton-loader type="text" width="60%" />
</template>
</v-skeleton-loader>
Использование слотов даёт полный контроль над визуальной структурой, позволяя повторить точный макет будущего контента.
v-skeleton-loader для карточек,
списков, профилей, чтобы минимизировать ощущение задержки при
загрузке данных.Скелетоны повышают интерактивность интерфейса и создают ощущение быстрого отклика, что особенно важно при работе с медленными API или большими объёмами данных.