Skeleton — это компонент, предназначенный для отображения временных заготовок контента до того момента, пока реальные данные не загрузятся. Он помогает улучшить пользовательский опыт, создавая ощущение интерактивности и динамики интерфейса, предотвращая «пустые» экраны при асинхронной загрузке данных.
Компонент Skeleton в Naive UI обладает набором свойств, позволяющих гибко настраивать внешний вид и поведение.
loading Тип: boolean
Определяет, отображать ли скелетон или реальный контент.
<n-skeleton :loading="isLoading">
<template #default>
<div>Контент загружен</div>
</template>
</n-skeleton>animation Тип:
'none' | 'wave' | 'pulse' Позволяет задавать тип анимации
скелетона.
none — без анимацииwave — волнообразная анимацияpulse — плавное мерцание<n-skeleton animation="wave" :loading="true" />round Тип: boolean
Позволяет скруглить углы скелетона. Полезно для имитации аватаров или
круглых карточек.
<n-skeleton round :loading="true" style="width: 50px; height: 50px;" />repeat и rows
repeat — количество повторяющихся блоков.rows — количество строк в одном блоке. Используется для
имитации списков и таблиц.<n-skeleton :rows="3" :repeat="2" :loading="true" />width и height
Позволяют задать размеры скелетона для точного соответствия будущему
контенту.
<n-skeleton style="width: 200px; height: 20px;" />Naive UI поддерживает использование слотов для отображения реального контента, который заменяет скелетон после загрузки:
default — основной слот, в который
помещается реальный контент.
<n-skeleton :loading="loading">
<template #default>
<p>Данные загружены</p>
</template>
</n-skeleton>avatar — слот для отображения
аватара или иконки с отдельным стилем.
<n-skeleton :loading="true">
<template #avatar>
<n-avatar size="40" />
</template>
</n-skeleton>title — слот для заголовка, который
может быть заменён на текст после загрузки.
Скелетон для списков и таблиц Комбинируя
repeat и rows, можно создавать заготовки для
сложных компонентов:
<n-skeleton :loading="isLoading" :repeat="5" :rows="3">
<template #default>
<n-list :data="listData" :render-item="item => <n-list-item>{{ item.text }}</n-list-item>" />
</template>
</n-skeleton>
Скелетон с кастомными стилями Можно использовать CSS для создания уникальных визуальных эффектов:
<n-skeleton :loading="true" style="background: linear-gradient(90deg, #eee 25%, #ddd 50%, #eee 75%); border-radius: 8px;" />
Скелетон с условной подгрузкой Скелетон удобно сочетать с асинхронными методами, чтобы показывать заготовку только во время загрузки данных:
<script setup>
import { ref, onMounted } from 'vue'
const data = ref(null)
const loading = ref(true)
onMounted(async () => {
const response = await fetch('/api/items')
data.value = await response.json()
loading.value = false
})
</script>
<n-skeleton :loading="loading">
<template #default>
<ul>
<li v-for="item in data" :key="item.id">{{ item.name }}</li>
</ul>
</template>
</n-skeleton>
repeat,
чтобы имитировать реальное количество элементов.round и width/height для
точного повторения формы контента (аватаров, кнопок, карточек).wave подходит для контента с текстовыми
блоками, pulse — для изображений или кнопок.style или CSS-классы позволяет
интегрировать скелетоны в любой дизайн системы.Skeleton в Naive UI — мощный инструмент для создания плавного, отзывчивого интерфейса, который визуально сообщает пользователю о процессе загрузки данных, минимизируя ощущение пустоты и задержки.