JavaRush /Курсы /Модуль 4: Node.js, Next.js и Angular /Первый компонент в Angular

Первый компонент в Angular

Модуль 4: Node.js, Next.js и Angular
13 уровень , 3 лекция
Открыта

1. Генерируем первый компонент: команда ng generate component

В Angular компонент — это самостоятельный кусочек интерфейса, который управляет своим HTML, стилями и логикой. Можно сказать, что компонент — это как мини-приложение внутри большого приложения. Каждый компонент отвечает за свой участок DOM-дерева.

Аналогия:
Если бы ваша страница была домом, то компонент — это одна комната с собственной мебелью (HTML), обоями (CSS) и правилами поведения (TypeScript-кодом).

В Angular всё строится вокруг компонентов. Даже если вы хотите просто показать «Hello World», вы делаете это через компонент. Так что, если вы освоите компоненты — вы на 90% освоите Angular!

Как создать компонент?

В терминале, находясь в корне вашего Angular-проекта, выполните:

ng generate component hello

или коротко:

ng g c hello

Здесь:

  • ng — команда Angular CLI,
  • generate (или просто g) — действие,
  • component (или c) — что именно генерируем,
  • hello — имя компонента.

Результат:
CLI создаст папку src/app/hello и четыре файла внутри:

  • hello.component.ts — TypeScript-класс компонента.
  • hello.component.html — шаблон (HTML-разметка).
  • hello.component.css — стили (по умолчанию CSS, но может быть SCSS/LESS).
  • hello.component.spec.ts — файл для тестов (можно пока не трогать).

CLI также автоматически зарегистрирует компонент в вашем основном модуле приложения (app.module.ts), чтобы он стал частью вашего приложения.

Это означает, что CLI автоматически добавит HelloComponent в массив declarations в файле src/app/app.module.ts. Модули (NgModule) — это способ Angular организовывать части вашего приложения, группируя компоненты, директивы и сервисы. Подробнее о них мы поговорим чуть позже, но важно знать, что каждый "классический" компонент должен быть объявлен в каком-либо модуле.

Пример кода:

Вот как выглядит app.module.ts после генерации hello компонента.


// src/app/app.module.ts (после генерации hello)
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HelloComponent } from './hello/hello.component'; // <--- Добавлен импорт

@NgModule({
  declarations: [
    HelloComponent, // <--- Компонент добавлен в declarations
    AppComponent // Ваш корневой компонент
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

2. Разбираем структуру компонента

Посмотрим, что получилось внутри папки hello:

Файл hello.component.ts


import { Component } from '@angular/core';

@Component({
  selector: 'app-hello',
  templateUrl: './hello.component.html',
  styleUrls: ['./hello.component.css']
})
export class HelloComponent {
  // Здесь будет логика вашего компонента
}

Здесь много нового — давайте разбираться по порядку.

Декоратор @Component

Это специальная «метка», которая превращает обычный TypeScript-класс в Angular-компонент. Внутри фигурных скобок указываются настройки:

  • selector — имя тега, через который компонент вставляется в HTML.
  • templateUrl — путь до файла с HTML-шаблоном.
  • styleUrls — массив путей до файлов со стилями.

Класс компонента

В примере выше это export class HelloComponent. Внутри этого класса вы будете описывать логику компонента: переменные, методы, обработчики событий и т.д.

Файл hello.component.html


<p>
  hello works!
</p>

Это стартовый шаблон. Можно заменить на что угодно — например, на приветствие или вашу любимую цитату.

Файл hello.component.css


/* hello.component.css */
p {
  color: green;
}

Стили из этого файла применяются только к шаблону этого компонента (о магии Angular-инкапсуляции поговорим чуть позже).

3. Как использовать компонент: selector

Самое интересное: как же вставить созданный компонент на страницу?

Ответ: используйте его селектор как обычный HTML-тег!

В нашем примере селектор — это app-hello (указан в selector: 'app-hello').

Пример использования

Откройте src/app/app.component.html (это шаблон главного компонента приложения) и добавьте туда строку:

<app-hello></app-hello>

Теперь, если вы обновите страницу (ng serve должен быть запущен), увидите свой новый компонент на главной странице приложения.

Важно:
Селектор должен быть уникальным! Если у вас есть два компонента с одним и тем же селектором — Angular не поймёт, кого вставлять, и устроит вам сюрприз (обычно в виде ошибки).

4. Изучаем шаблон компонента (template)

Шаблон — это HTML, который определяет, как компонент выглядит на странице.

Примеры шаблонов

Простой шаблон:

<p>Добро пожаловать в мой первый Angular-компонент!</p>

Шаблон с данными из компонента:

В файле hello.component.ts:


export class HelloComponent {
  username = 'Алиса';
}

В файле hello.component.html:

<p>Привет, {{ username }}!</p>

Здесь {{ username }} — это интерполяция (подстановка значения переменной из TypeScript-класса в HTML).

5. Inline template и inline styles

Иногда хочется не плодить лишние файлы, а написать шаблон и стили прямо в TypeScript-коде. Для этого используйте параметры template и styles в декораторе:


@Component({
  selector: 'app-inline-demo',
  template: `<h2>Это inline-шаблон</h2>`,
  styles: [`h2 { color: blue; }`]
})
export class InlineDemoComponent {}

CLI по умолчанию создаёт отдельные файлы, но если вы любите компактность, можно использовать inline-стили и шаблоны (например, для маленьких компонентов).

6. Стилизация компонента: инкапсуляция стилей

Angular заботится о том, чтобы стили компонента не «протекали» наружу и не ломали внешний вид других компонентов. Каждый компонент — как будто в своём CSS-аквариуме.

Пример:

В hello.component.css:


p {
  background: yellow;
  font-weight: bold;
}

В hello.component.html:

<p>Это стилизованный компонент!</p>

Результат:
Жёлтый фон и жирный шрифт применятся только к <p> внутри компонента hello, но не затронут другие параграфы на странице.

Нюанс:
Инкапсуляция работает по умолчанию, но её можно изменить через параметр encapsulation (для особых случаев, когда вам нужно глобальное влияние стилей — но это тема для отдельной лекции).

7. Практика: создаём свой первый компонент

Давайте добавим интерактивности нашему учебному приложению. Например, пусть пользователь видит приветствие и кнопку «Показать дату». После нажатия на кнопку — появляется текущая дата и время.

Шаг 1: Генерируем компонент

ng g c show-date

Шаг 2: Редактируем show-date.component.ts


import { Component } from '@angular/core';

@Component({
  selector: 'app-show-date',
  templateUrl: './show-date.component.html',
  styleUrls: ['./show-date.component.css']
})
export class ShowDateComponent {
  currentDate: string | null = null;

  showDate() {
    this.currentDate = new Date().toLocaleString();
  }
}

Шаг 3: Редактируем show-date.component.html


<p>Добро пожаловать!</p>
<button (click)="showDate()">Показать дату</button>
<p *ngIf="currentDate">Текущая дата и время: {{ currentDate }}</p>

Пояснение:

  • (click)="showDate()" — обработчик события (подробнее о событиях будет в следующих лекциях).
  • *ngIf="currentDate" — показывает параграф только если есть дата.

Шаг 4: Стилизация (show-date.component.css)


button {
  background: #4caf50;
  color: white;
  border: none;
  padding: 8px 16px;
  cursor: pointer;
  border-radius: 4px;
}

Шаг 5: Используем компонент в app.component.html

<app-show-date></app-show-date>

Проверьте результат!
У вас появилось приветствие, кнопка, и после нажатия появляется текущая дата. Поздравляю: вы только что создали свой первый интерактивный Angular-компонент!

8. Что происходит "под капотом"?

Когда вы запускаете ng serve, Angular компилирует ваши компоненты, объединяет их шаблоны и стили, и вставляет результат в DOM. Каждый компонент живёт своей жизнью, но может общаться с другими (через свойства, события и сервисы — об этом позже).

Схема:

graph TD
    A[app.component.html]
    B[&lt;app-show-date&gt;]
    C[show-date.component.html]
    D[show-date.component.css]
    A --> B
    B --> C
    B --> D

9. Типичные ошибки при создании и использовании компонентов

Ошибка №1: Не тот селектор.
Вы указали <hello></hello> вместо <app-hello></app-hello>, а компонент не отображается. Angular ищет именно тот селектор, который вы указали в декораторе.

Ошибка №2: Не импортировали компонент в модуль.
Если вы вручную создаёте компонент (без CLI), не забудьте добавить его в массив declarations вашего модуля (app.module.ts). CLI делает это за вас, но ручная работа — ручная ответственность!

Ошибка №3: Редактируете не тот файл.
Иногда можно случайно править app.component.html вместо своего нового компонента, и не видеть изменений. Проверяйте путь!

Ошибка №4: Нарушение уникальности селектора.
Два компонента с одинаковым селектором — Angular не простит.

Ошибка №5: Ожидание глобального действия стилей.
Стили компонента применяются только внутри него. Если вы хотите изменить внешний вид всего приложения — используйте styles.css или настройте инкапсуляцию.

Ошибка №6: Ошибка в шаблоне.
Забыли закрыть тег или ошиблись в синтаксисе интерполяции ({{ ... }}) — получите ошибку компиляции.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ