Прогресс-индикаторы являются важной частью пользовательского интерфейса, позволяя визуально отображать выполнение асинхронных задач, загрузку данных или прогресс выполнения операций. В экосистеме SvelteKit они реализуются с помощью специализированных компонентов, часто предоставляемых UI-библиотеками, такими как Svelte Material UI, SvelteStrap, Flowbite-Svelte и другими.
Линейные (Linear / Bar)
Круговые (Circular / Spinner)
Многоступенчатые / Step Progress
Простейший способ реализации линейного прогресс-бара через компонент SvelteKit UI выглядит следующим образом:
<script>
import { LinearProgress } from 'svelte-material-ui';
let progress = 0;
const simulateProgress = () => {
const interval = setInterval(() => {
progress += 5;
if (progress >= 100) clearInterval(interval);
}, 200);
};
</script>
<LinearProgress bind:value={progress} />
<button on:click={simulateProgress}>Запустить прогресс</button>
Ключевые моменты:
bind:value связывает внутреннее состояние компонента с
переменной progress.setInterval или
асинхронные функции.Круговой индикатор удобен для отображения неопределённого прогресса:
<script>
import { CircularProgress } from 'svelte-material-ui';
let determinate = false;
let value = 0;
const simulateCircular = () => {
determinate = true;
const interval = setInterval(() => {
value += 10;
if (value >= 100) clearInterval(interval);
}, 300);
};
</script>
<CircularProgress {determinate} bind:value={value} />
<button on:click={simulateCircular}>Старт кругового прогресса</button>
Особенности:
determinate — режим с известным процентом
выполнения.Прогресс-бары в SvelteKit UI поддерживают кастомизацию:
height,
thickness для линейных и радиус для круговых.transition или встроенные анимации компонента.<LinearProgress class="h-2 rounded-full bg-gray-200" style="--progress-color: #3b82f6;" bind:value={progress} />
Часто прогресс связан с состоянием загрузки данных или API-запросов. Использование Svelte stores позволяет синхронизировать индикаторы с глобальными состояниями:
<script>
import { LinearProgress } from 'svelte-material-ui';
import { writable } from 'svelte/store';
export const loadProgress = writable(0);
async function fetchData() {
loadProgress.set(0);
for (let i = 1; i <= 10; i++) {
await new Promise(r => setTimeout(r, 200));
loadProgress.update(n => n + 10);
}
}
</script>
<LinearProgress bind:value={$loadProgress} />
<button on:click={fetchData}>Загрузить данные</button>
Преимущества такого подхода:
store.Для визуализации многошаговых процессов используются Step Progress:
<script>
import Stepper from 'flowbite-svelte/Stepper';
let step = 1;
const nextStep = () => step = Math.min(step + 1, 4);
const prevStep = () => step = Math.max(step - 1, 1);
</script>
<Stepper currentStep={step} steps={[
{ label: 'Выбор продукта' },
{ label: 'Оплата' },
{ label: 'Доставка' },
{ label: 'Завершение' }
]} />
<button on:click={prevStep}>Назад</button>
<button on:click={nextStep}>Вперед</button>
Особенности:
SvelteKit UI позволяет связывать прогресс с событиями, например, завершением HTTP-запросов или WebSocket-событий:
<script>
import { LinearProgress } from 'svelte-material-ui';
import { onMount } from 'svelte';
let progress = 0;
onMount(async () => {
const data = await fetch('/api/data');
const total = 100;
const reader = data.body.getReader();
while(true) {
const { done, value } = await reader.read();
if (done) break;
progress += (value.length / total) * 100;
}
});
</script>
<LinearProgress bind:value={progress} />
Вывод: прогресс-индикаторы SvelteKit UI обеспечивают гибкость и удобство для отображения процессов любого типа, с возможностью кастомизации, интеграции с состоянием приложения и визуализации как линейного, так и многоступенчатого прогресса.