Фреймворк Svelte позволяет легко строить клиентские приложения с динамическими маршрутами и передавать параметры в компоненты. В отличие от традиционных подходов, где маршруты определяются в серверной части или в сложных настройках роутера, Svelte позволяет организовать маршруты с минимальными усилиями, предоставляя гибкость и удобство работы.
В Svelte для работы с маршрутизацией используется библиотека
svelte-routing, которая является простым, но мощным
инструментом для создания маршрутов. Встроенные механизмы Svelte
позволяют динамически менять компоненты в зависимости от URL, что делает
приложение более интерактивным и отзывчивым.
Маршруты могут быть как статичными, так и динамическими. Для создания динамического маршрута в Svelte достаточно указать переменные в пути маршрута. Например, если необходимо создать маршрут для страницы пользователя, где в URL будет передаваться его ID, то путь может выглядеть следующим образом:
import { Router, Route, Link } from "svelte-routing";
<Router>
<Route path="/user/:id" component={UserPage} />
</Router>
В этом примере :id — это динамический параметр, который
будет передан в компонент UserPage. Таким образом, маршрут
становится гибким и способным подстраиваться под различные
параметры.
После того как динамический маршрут был настроен, следующий шаг — это
извлечение параметров маршрута в компоненте. В Svelte это можно сделать
с помощью хука useParams, который предоставляет доступ к
параметрам маршрута.
Пример:
<script>
import { useParams } from "svelte-routing";
const params = useParams();
const userId = params.id;
</script>
<h1>Пользователь {userId}</h1>
Здесь useParams возвращает объект с параметрами
маршрута, в данном случае с полем id, который извлекается и
используется в компоненте. Это позволяет динамически подстраивать
содержимое страницы в зависимости от данных, переданных в URL.
Svelte поддерживает не только простые динамические маршруты, но и вложенные маршруты. Вложенные маршруты используются, когда необходимо отображать несколько компонентов на одной странице, в зависимости от различных частей URL.
Для создания вложенных маршрутов используется компонент
<Route>, который можно вложить внутри других
маршрутов:
<Router>
<Route path="/user/:id" component={UserPage}>
<Route path="profile" component={UserProfile} />
<Route path="settings" component={UserSettings} />
</Route>
</Router>
Здесь для маршрута /user/:id создаются вложенные
маршруты для профиля и настроек пользователя. При переходе по пути
/user/123/profile будет отображаться компонент
UserProfile, а при переходе по пути
/user/123/settings — компонент
UserSettings.
В Svelte можно использовать не только параметры маршрута (как в
примере с :id), но и query-параметры. Они являются частью
URL и начинаются после знака вопроса ?.
Пример маршрута с query-параметром:
<Router>
<Route path="/search" component={SearchPage} />
</Router>
Для использования query-параметров, таких как
/search?query=svelte, можно извлечь их в компоненте с
помощью window.location.search или через библиотеку
svelte-routing. Пример с использованием
window.location.search:
<script>
let searchParams = new URLSearchParams(window.location.search);
let query = searchParams.get("query");
</script>
<h1>Результаты поиска по запросу: {query}</h1>
Этот подход позволяет динамически изменять содержимое страницы в зависимости от значений query-параметров.
В некоторых случаях может понадобиться передать параметры не через query-параметры, а через части пути. Это реализуется с помощью динамических маршрутов, как показано ранее. Однако иногда важно настроить точную передачу нескольких параметров, например, для отображения информации о товаре в интернет-магазине.
Пример маршрута с несколькими динамическими параметрами:
<Router>
<Route path="/product/:category/:id" component={ProductPage} />
</Router>
Здесь маршрут /product/:category/:id будет принимать два
параметра: category и id, которые можно
использовать внутри компонента ProductPage.
<script>
import { useParams } from "svelte-routing";
const params = useParams();
const category = params.category;
const productId = params.id;
</script>
<h1>Товар {category} - {productId}</h1>
Переход между маршрутами в Svelte осуществляется через компонент
<Link>, который позволяет задать путь для перехода и
автоматическую обработку маршрута при клике.
Пример использования <Link>:
<Link to="/user/123">Профиль пользователя</Link>
Этот компонент автоматически обработает переход, обеспечив правильную загрузку компонента, соответствующего маршруту.
Для сложных сценариев, когда необходимо не только отображать данные на основе параметров маршрута, но и управлять состоянием внутри компонентов, Svelte предоставляет мощные средства работы с состоянием.
Для управления состоянием можно использовать как локальные переменные компонента, так и глобальное состояние, используя хранилища (stores). Хранилища позволяют сохранять данные, которые могут быть использованы во многих компонентах, и реагировать на изменения этих данных.
Пример использования хранилища для состояния маршрута:
import { writable } from 'svelte/store';
const currentUser = writable(null);
<script>
import { useParams } from 'svelte-routing';
import { currentUser } from './store';
const params = useParams();
currentUser.set(params.id);
</script>
<h1>Текущий пользователь: {$currentUser}</h1>
Здесь значение currentUser хранится в хранилище, что
позволяет отслеживать изменения параметров маршрута и реагировать на
них, обновляя интерфейс.
Кроме использования компонента <Link>, также
существует возможность программного перехода между маршрутами. Для этого
можно использовать метод history.push или
history.replace стандартного API браузера.
Пример:
import { navigate } from "svelte-routing";
function goToProfile() {
navigate("/user/123");
}
Этот подход полезен, когда необходимо выполнить переход по маршруту после какого-либо события, например, после успешной авторизации пользователя.
Важно предусмотреть обработку ситуаций, когда пользователь пытается
перейти на несуществующий маршрут. Для этого в Svelte можно использовать
компонент <Route> с атрибутом exact,
который будет отвечать за точное совпадение маршрута. В случае ошибок
можно настроить вывод страницы ошибки или редирект.
Пример:
<Router>
<Route path="/user/:id" component={UserPage} />
<Route path="*" component={NotFoundPage} />
</Router>
Здесь, если маршрут не совпадает с ни одним из заданных, будет
отображена страница ошибки NotFoundPage.
Динамические маршруты и параметры — это мощный инструмент для создания интерактивных приложений на Svelte. Использование динамических параметров, вложенных маршрутов и обработка различных типов данных позволяет гибко настроить роутинг для любого приложения. Возможности для обработки ошибок, использования query-параметров и управления состоянием делают Svelte отличным выбором для разработки современных SPA (Single Page Application).