Справочник декораторов
Справочник декораторов в Angular является ключевым инструментом для разработки современных веб-приложений и SPA, так как позволяет добавлять метаданные к классам, методам и свойствам, определяя их поведение в рамках Angular. Декораторы упрощают создание компонентов, управление состоянием, организацию потоков данных и контроль жизненного цикла элементов.
Наиболее важными декораторами являются @Component, @Directive, @Pipe, @Injectable и @NgModule. @Component определяет компонент пользовательского интерфейса, @Directive создаёт кастомные директивы для DOM, @Pipe выполняет преобразование данных в шаблонах, @Injectable позволяет использовать dependency injection, а @NgModule структурирует приложение в модули. Дополнительные декораторы, такие как @Input и @Output, обеспечивают обмен данными между компонентами, а @ViewChild и @ContentChild дают доступ к дочерним элементам и контенту шаблона.
В этом справочнике вы научитесь правильно использовать декораторы, создавать масштабируемые и оптимизированные компоненты, избегая распространённых ошибок, таких как prop drilling, ненужные повторные рендеры и мутации состояния. В результате разработчик сможет эффективно внедрять декораторы в реальных Angular-проектах, обеспечивая высокую производительность, поддерживаемость и безопасность приложения.
Базовый Пример
typescriptimport { Component, Input } from '@angular/core';
@Component({
selector: 'app-user-card',
template: ` <div class="card"> <h2>{{ name }}</h2> <p>Возраст: {{ age }}</p> </div>
`,
styles: [` .card {
padding: 16px;
border-radius: 8px;
background-color: #f5f5f5;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
text-align: center;
}
`]
})
export class UserCardComponent {
@Input() name!: string;
@Input() age!: number;
}
В данном примере декоратор @Component превращает класс UserCardComponent в полностью функциональный компонент Angular. Параметр selector задаёт HTML-тег для использования компонента, template и styles определяют визуальное отображение. Декораторы @Input позволяют передавать данные от родительского компонента, предотвращая prop drilling.
Angular автоматически управляет жизненным циклом компонента, обеспечивая корректную инициализацию, рендеринг и уничтожение. Изменения свойств, помеченных @Input, автоматически обновляют интерфейс, уменьшая лишние повторные рендеры. Пример демонстрирует, как декораторы управляют потоками данных, состоянием и структурой компонентов, применимыми в реальных проектах.
Практический Пример
typescriptimport { Component, Input, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'app-counter',
template: ` <div class="counter"> <h3>Счётчик: {{ count }}</h3> <button (click)="increment()">+</button> <button (click)="decrement()">-</button> </div>
`,
styles: [` .counter {
display: flex;
gap: 10px;
justify-content: center;
align-items: center;
}
`]
})
export class CounterComponent {
@Input() count: number = 0;
@Output() countChange = new EventEmitter<number>();
increment() {
this.count++;
this.countChange.emit(this.count);
}
decrement() {
this.count--;
this.countChange.emit(this.count);
}
}
Advanced Angular Implementation
typescriptimport { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';
@Component({
selector: 'app-smart-counter',
template: ` <div class="smart-counter"> <h3>Умный Счётчик: {{ value }}</h3> <button (click)="increase()">+</button> <button (click)="decrease()">-</button> </div>
`,
styles: [` .smart-counter {
background-color: #e0f7fa;
padding: 16px;
border-radius: 12px;
text-align: center;
}
`]
})
export class SmartCounterComponent implements OnInit, OnChanges {
@Input() value: number = 0;
@Output() valueChange = new EventEmitter<number>();
ngOnInit() {
console.log('SmartCounter инициализирован с значением:', this.value);
}
ngOnChanges(changes: SimpleChanges) {
if (changes['value']) {
console.log('Значение изменилось:', changes['value'].currentValue);
}
}
increase() {
this.value++;
this.valueChange.emit(this.value);
}
decrease() {
this.value--;
this.valueChange.emit(this.value);
}
}
SmartCounterComponent сочетает использование @Input, @Output и lifecycle hooks (OnInit, OnChanges) для управления состоянием и реактивного обновления интерфейса. Декораторы обеспечивают повторное использование компонента и предотвращают prop drilling и ненужные рендеры. Такой подход оптимизирует работу с потоками данных и состоянием, что критично для масштабируемых и поддерживаемых Angular-приложений.
Лучшие практики включают использование @Input только для необходимых данных и @Output для событий. Избегайте прямого изменения состояния или чрезмерного prop drilling. Для оптимизации производительности используйте ChangeDetectionStrategy.OnPush. Инструменты, такие как Angular DevTools, помогают отслеживать жизненный цикл и EventEmitter. Корректное использование декораторов обеспечивает безопасные, производительные и масштабируемые приложения Angular.
📊 Полная Справка
Angular Element/Method | Description | Syntax | Example | Notes |
---|---|---|---|---|
@Component | Определяет компонент | @Component({...}) | @Component({ selector:'app-demo', template:'...' }) | Основной декоратор |
@Directive | Создаёт директиву | @Directive({...}) | @Directive({ selector:'[highlight]' }) | Управляет DOM |
@Pipe | Преобразует данные | @Pipe({...}) | @Pipe({name:'capitalize'}) | Изменяет отображение данных |
@NgModule | Определяет модуль | @NgModule({...}) | @NgModule({ declarations:[], imports:[] }) | Организует приложение |
@Injectable | Позволяет DI | @Injectable({...}) | @Injectable({ providedIn:'root' }) | Для внедрения зависимостей |
@Input | Входные данные | @Input() prop:type | @Input() title:string | Принимает данные от родителя |
@Output | События компонента | @Output() event=new EventEmitter() | @Output() clicked=new EventEmitter() | Отправляет данные родителю |
@HostListener | Слушает события DOM | @HostListener('click') handler(){} | @HostListener('window:scroll') onScroll() | Привязка событий |
@ViewChild | Доступ к дочерним | @ViewChild(ChildComponent) child!:ChildComponent | Манипуляция дочерним компонентом | |
@ContentChild | Доступ к контенту | @ContentChild(TemplateRef) tpl!:TemplateRef | Управление проектируемым шаблоном | |
@HostBinding | Привязка свойств | @HostBinding('class.active') isActive=true | Динамическое управление DOM |
📊 Complete Angular Properties Reference
Property | Values | Default | Description | Angular Support |
---|---|---|---|---|
selector | string | none | Селектор компонента | все версии |
template | string | none | Шаблон компонента | 2+ |
styles | array | string[] | none | CSS компонента |
providers | array | [] | Провайдеры DI | 2+ |
inputs | array | [] | Список @Input | 4+ |
outputs | array | [] | Список @Output | 4+ |
animations | array | [] | Анимации | 4+ |
changeDetection | string | 'Default' | Стратегия Change Detection | 5+ |
encapsulation | string | 'Emulated' | Инкапсуляция CSS | 2+ |
standalone | boolean | false | Standalone компонент | 14+ |
imports | array | [] | Импорт модулей | 14+ |
schemas | array | [] | Разрешение кастомных элементов | 9+ |
Изучение Справочника декораторов позволяет создавать оптимизированные, повторно используемые и масштабируемые компоненты. Освоение потоков данных, управления состоянием и жизненного цикла обеспечивает разработку эффективных Angular-приложений. Рекомендуется изучать Dependency Injection, дополнительные lifecycle hooks, стратегии Change Detection и работу с RxJS для асинхронного управления данными, чтобы углубить профессиональные навыки.
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху