Характеристика | @Component | @Directive |
---|---|---|
Назначение | Создание компонентов с шаблоном | Добавление поведения к элементам |
Шаблон | Обязателен (template/templateUrl) | Отсутствует |
Селектор | Обычно элемент (тег) | Чаще атрибут (но может быть любой) |
Инкапсуляция | Поддерживает ViewEncapsulation | Нет инкапсуляции стилей |
Жизненный цикл | Полный набор хуков | Только основные хуки |
Компоненты - это строительные блоки UI в Angular. Они обязательно включают:
Пример компонента:
@Component({
selector: 'app-user-card',
templateUrl: './user-card.component.html',
styleUrls: ['./user-card.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class UserCardComponent {
@Input() user: User;
}
Ключевые особенности:
Директивы добавляют поведение к существующим элементам. Они не создают собственный шаблон.
Пример директивы:
@Directive({
selector: '[appTooltip]'
})
export class TooltipDirective {
@HostListener('mouseenter') showTooltip() {
// Логика показа подсказки
}
}
Типы директив:
@Component({
selector: 'app-product-list',
template: `
<div *appHighlight="'yellow'">
<app-product-item
*ngFor="let product of products"
[product]="product">
</app-product-item>
</div>
`
})
export class ProductListComponent {}
@Directive({
selector: '[appHighlight]'
})
export class HighlightDirective {
@Input() appHighlight: string;
constructor(private el: ElementRef) {}
ngOnInit() {
this.el.nativeElement.style.backgroundColor = this.appHighlight;
}
}
Компоненты создают больше накладных расходов:
Директивы более легковесны:
Компоненты:
Директивы:
Выбор между ними зависит от задачи:
Понимание различий критически важно для: