Stencil — это инструмент для создания веб-компонентов, который
позволяет разрабатывать компоненты с высокой производительностью,
поддерживающие стандартные возможности, такие как рендеринг на стороне
клиента и сервере, а также интеграцию с фреймворками и библиотеками.
Важной частью любой веб-разработки является маршрутизация, или обработка
переходов между различными страницами и состояниями приложения. В
Stencil маршрутизация выполняется с помощью компонента
<stencil-router>, который предоставляет возможности
сопоставления URL с компонентами и динамическими данными.
Маршрутизация в Stencil осуществляется через компонент
<stencil-router>, который управляет всеми аспектами
переходов между состояниями приложения, включая URL-адреса, параметры и
обработку событий перехода. Этот компонент позволяет связывать URL с
конкретными компонентами с помощью маршрутов, а также поддерживает
динамическое изменение данных в зависимости от маршрута.
Каждый маршрут в Stencil определяется с помощью тега
<stencil-route>, который внутри себя описывает
URL-адрес, с которым будет ассоциирован компонент, а также может
включать дополнительные параметры для динамической загрузки
контента.
Пример базового маршрута:
<stencil-router>
<stencil-route url="/" component="home-page" />
<stencil-route url="/about" component="about-page" />
</stencil-router>
В данном примере при переходе по URL-адресам / и
/about будут отображаться компоненты home-page
и about-page соответственно. Это основной механизм работы
маршрутизации.
Stencil также поддерживает динамическое сопоставление маршрутов, что позволяет создавать более гибкие и сложные приложения. Это возможно с помощью использования параметров в URL, которые можно передавать в компонент через свойства. Например, URL может содержать динамическую часть, которая будет соответствовать переменной в компоненте.
Пример:
<stencil-router>
<stencil-route url="/user/:id" component="user-profile" />
</stencil-router>
В этом случае, при переходе по адресу /user/123,
значение id будет доступно внутри компонента
user-profile как параметр.
Внутри компонента user-profile можно получить значение
параметра следующим образом:
@Component({
tag: 'user-profile',
styleUrl: 'user-profile.css',
shadow: true,
})
export class UserProfile {
@Prop() match: MatchResults;
render() {
return <div>Profile ID: {this.match?.params.id}</div>;
}
}
Здесь match.params.id будет содержать значение,
переданное в URL, в данном случае это 123.
Маршруты в Stencil могут не только передавать параметры, но и обрабатывать их. Например, можно передавать несколько параметров в одном маршруте или использовать параметры как фильтры для загрузки данных.
Пример с несколькими параметрами:
<stencil-router>
<stencil-route url="/product/:category/:id" component="product-details" />
</stencil-router>
В этом случае при переходе по URL
/product/electronics/12345 параметры category
и id будут переданы в компонент
product-details.
В компоненте можно их получить следующим образом:
@Component({
tag: 'product-details',
styleUrl: 'product-details.css',
shadow: true,
})
export class ProductDetails {
@Prop() match: MatchResults;
render() {
return (
<div>
<h1>Category: {this.match?.params.category}</h1>
<h2>Product ID: {this.match?.params.id}</h2>
</div>
);
}
}
Для создания навигации между различными страницами в Stencil можно
использовать компонент <stencil-route-link>. Этот
компонент позволяет создавать ссылки, которые будут активировать
соответствующие маршруты. Например:
<stencil-route-link url="/about">About Us</stencil-route-link>
При клике на эту ссылку произойдёт переход к маршруту
/about, что вызовет рендеринг компонента, ассоциированного
с этим маршрутом.
Кроме того, в Stencil есть механизм активных маршрутов. Он позволяет
определить, какой маршрут в данный момент активен, и соответственно
изменить стиль или поведение компонента. Компонент
<stencil-route> поддерживает атрибут
exact, который позволяет сделать совпадение маршрута
точным.
Пример использования точного совпадения:
<stencil-router>
<stencil-route url="/" component="home-page" exact />
<stencil-route url="/about" component="about-page" />
</stencil-router>
В данном случае только точное совпадение с корневым маршрутом
/ активирует компонент home-page.
Stencil также поддерживает групповую маршрутизацию, что позволяет создать более организованные и читаемые файлы с маршрутизацией. Для этого можно использовать вложенные маршруты или создать отдельные маршрутизаторы для разных частей приложения.
Пример вложенных маршрутов:
<stencil-router>
<stencil-route url="/" component="home-page" />
<stencil-route url="/profile">
<stencil-route url="/settings" component="profile-settings" />
<stencil-route url="/edit" component="profile-edit" />
</stencil-route>
</stencil-router>
Здесь маршрут /profile является контейнером для двух
вложенных маршрутов: /profile/settings и
/profile/edit.
В Stencil также поддерживается защита маршрутов, что позволяет
управлять доступом к определённым страницам. Для этого можно
использовать атрибуты маршрута, такие как beforeEnter и
onMatch, чтобы выполнить проверку доступа перед рендерингом
компонента.
Пример редиректа:
<stencil-router>
<stencil-route url="/admin" component="admin-page" beforeEnter={() => checkAuth()} />
</stencil-router>
Если функция checkAuth() возвращает false,
можно выполнить редирект на страницу входа, например, с использованием
компонента <stencil-route-link>.
Stencil позволяет использовать различные техники для улучшения производительности приложений с маршрутизацией. Одной из таких техник является кэширование маршрутов, когда компоненты, уже отрендеренные при переходах, могут быть повторно использованы, не перезагружая их. Это значительно снижает время загрузки и повышает отзывчивость приложения.
Для кэширования можно использовать атрибут cache в
компоненте <stencil-route>, что позволяет сохранять
состояние компонента между навигациями.
<stencil-router>
<stencil-route url="/product/:id" component="product-page" cache={true} />
</stencil-router>
Маршрутизация в Stencil является мощным инструментом для построения
приложений с динамическим контентом. Использование компонентов
<stencil-router>, <stencil-route>,
и <stencil-route-link> позволяет легко настроить
динамическое сопоставление маршрутов, обработку параметров, создание
навигации и защиту маршрутов. Поддержка таких возможностей, как
вложенные маршруты, точные совпадения и кэширование, делает Stencil
гибким инструментом для реализации сложных маршрутов в современных
веб-приложениях.