В Angular компонент представляет собой базовую строительную единицу приложения, которая управляет логикой отображения части пользовательского интерфейса. Каждый компонент состоит из трёх основных элементов: шаблона (HTML), класса (TypeScript) и стилей (CSS). В этой главе рассматривается процесс создания компонентов, их регистрация и организация в Angular-приложении.
Каждый компонент в Angular требует как минимум трёх элементов:
Для создания нового компонента Angular предоставляет команду
ng generate component (или её сокращённую версию
ng g c), которая автоматически создаёт все необходимые
файлы:
ng generate component имя-компонента
Эта команда создаёт четыре файла:
Рассмотрим пример простого компонента:
import { Component } from '@angular/core';
@Component({
selector: 'app-example',
templateUrl: './example.component.html',
styleUrls: ['./example.component.css']
})
export class ExampleComponent {
title: string = 'Пример компонента';
}
В этом примере компонент ExampleComponent имеет
свойство title, которое отображается в шаблоне. Атрибут
selector указывает на имя тега, которое будет
использоваться для внедрения компонента в другие части приложения. В
данном случае компонент будет использоваться как
<app-example></app-example>.
Шаблон компонента (example.component.html):
<h1>{{ title }}</h1>
Стили компонента (example.component.css):
h1 {
color: blue;
}
Чтобы компонент стал доступным для использования в приложении, его
необходимо зарегистрировать в модуле. Каждый Angular-приложение
организовано вокруг модулей, которые служат
контейнерами для компонентов, директив, сервисов и других элементов.
Модуль описывается в файле с расширением .module.ts.
Регистрация компонента происходит в секции declarations
модуля, где перечисляются все компоненты, директивы и пайпы,
принадлежащие данному модулю.
Пример регистрации компонента в модуле:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { ExampleComponent } from './example/example.component';
@NgModule({
declarations: [
ExampleComponent
],
imports: [
BrowserModule
],
providers: [],
bootstrap: [ExampleComponent]
})
export class AppModule { }
Здесь компонент ExampleComponent добавлен в массив
declarations модуля AppModule, что
позволяет использовать его внутри шаблонов этого модуля.
После регистрации компонента его можно использовать в любом другом компоненте, который принадлежит тому же модулю, или в модуле, который импортирует текущий. Например, чтобы использовать ExampleComponent в другом компоненте, достаточно указать его селектор в шаблоне:
<app-example></app-example>
Если компонент используется в другом модуле, нужно убедиться, что модуль, в котором зарегистрирован компонент, был импортирован в текущий модуль.
Для того чтобы компонент мог принимать данные, используются
входные параметры (inputs). В Angular они реализуются с
помощью декоратора @Input(), который позволяет
родительскому компоненту передавать данные в дочерний.
Пример использования входного параметра:
import { Component, Input } from '@angular/core';
@Component({
selector: 'app-child',
template: `<h2>{{ name }}</h2>`
})
export class ChildComponent {
@Input() name: string;
}
В родительском компоненте данные передаются через привязку:
<app-child [name]="parentName"></app-child>
В этом примере значение parentName, заданное в
родительском компоненте, будет передано в дочерний компонент как
параметр name.
Компоненты могут обмениваться данными не только через входные
параметры, но и через выходные события. Для этого
используется декоратор @Output() и объект
EventEmitter, который позволяет компоненту посылать
события в родительский компонент.
Пример создания события:
import { Component, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'app-button',
template: `<button (click)="sendEvent()">Нажми меня</button>`
})
export class ButtonComponent {
@Output() clicked = new EventEmitter<void>();
sendEvent() {
this.clicked.emit();
}
}
Родительский компонент обрабатывает событие, подписываясь на его вызов:
<app-button (clicked)="onButtonClick()"></app-button>
В родительском компоненте метод onButtonClick() будет
вызван при клике на кнопку.
Angular предоставляет механизмы для управления жизненным циклом
компонента через интерфейсы, такие как OnInit,
OnChanges, OnDestroy. Эти интерфейсы позволяют
компоненту реагировать на события, происходящие в его жизни, например,
при инициализации, изменении данных или удалении.
Пример использования интерфейса OnInit:
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-lifecycle',
template: `<p>Компонент инициализирован</p>`
})
export class LifecycleComponent implements OnInit {
ngOnInit() {
console.log('Компонент инициализирован');
}
}
Использование компонентов в Angular имеет множество преимуществ:
Каждый компонент — это не только визуальная единица приложения, но и важная часть архитектуры, обеспечивающая стабильность и простоту масштабирования приложения.