В Stencil разработке для управления жизненным циклом компонентов и обработки запросов часто используются механизмы защиты (Guards) и промежуточного ПО (middleware). Эти инструменты позволяют встраивать логику, которая выполняется до или после основных операций, например, перед рендерингом компонента или в процессе обработки запроса к серверу. Они значительно увеличивают гибкость и контроль над процессом работы приложения.
Guards (стражи) в Stencil — это функции, которые выполняются до того, как произойдут основные действия, такие как рендеринг компонента, и могут запретить выполнение этих действий в зависимости от заданных условий.
Главная цель Guards — это защита компонентов или маршрутов от нежелательных действий, таких как переход по маршруту без авторизации или попытка рендеринга компонента при отсутствии необходимых данных.
false или отклоняет
промис, действие будет отменено.import { Component, h, Prop, State } from '@stencil/core';
import { Guard } from 'stencil-routing';
@Component({
tag: 'user-profile',
styleUrl: 'user-profile.css',
shadow: true
})
export class UserProfile {
@Prop() userId: string;
@State() userData: any;
@Guard()
async checkAuthorization() {
// Логика проверки авторизации
if (!this.userId) {
return false; // Не авторизован, действие не выполнится
}
return true; // Если пользователь авторизован, действие продолжится
}
async componentWillLoad() {
// Загрузка данных пользователя
if (this.userId) {
const response = await fetch(`/api/user/${this.userId}`);
this.userData = await response.json();
}
}
render() {
return (
<div>
{this.userData ? <p>{this.userData.name}</p> : <p>Загрузка...</p>}
</div>
);
}
}
В данном примере Guard проверяет, имеет ли пользователь необходимую информацию для отображения профиля. Если нет, рендеринг компонента будет отменен.
Middleware (посредники) — это функции, которые выполняются в процессе обработки запроса или изменения состояния. Они представляют собой цепочку промежуточных обработчиков, через которые проходит запрос или данные, позволяя трансформировать их, логировать или валидацировать на разных этапах.
Механизм Middleware в Stencil используется для управления потоком данных между компонентами или в процессе обработки событий, таких как HTTP-запросы или события пользовательского интерфейса.
import { Component, h, Prop } from '@stencil/core';
import { Middleware } from 'stencil-routing';
@Component({
tag: 'user-dashboard',
styleUrl: 'user-dashboard.css',
shadow: true
})
export class UserDashboard {
@Prop() userId: string;
@Prop() userData: any;
@Middleware()
async logRequest(next) {
console.log(`Запрос к данным пользователя с ID: ${this.userId}`);
await next(); // Переход к следующему обработчику или основной логике
}
async componentWillLoad() {
// Загрузка данных пользователя
const response = await fetch(`/api/user/${this.userId}`);
this.userData = await response.json();
}
render() {
return (
<div>
{this.userData ? <p>{this.userData.name}</p> : <p>Загрузка...</p>}
</div>
);
}
}
В примере выше, middleware функция logRequest выполняет
логирование запроса до того, как компонент начнёт загружать данные. Это
может быть полезно для мониторинга и отладки.
Хотя Guards и Middleware схожи в том, что обе технологии позволяют модифицировать поведение приложения, существует несколько ключевых различий:
Использование Guards и Middleware в Stencil позволяет значительно улучшить архитектуру приложения, предоставляя разработчику мощные инструменты для управления жизненным циклом компонентов и обработки данных. Guards обеспечивают контроль доступа и выполнение условий до выполнения основного действия, в то время как Middleware предоставляет гибкость для обработки данных и запросов, улучшая производительность и удобство работы с приложением.