Angular: como funciona um componente?

DIEGO CARLOS MARTINS GAYOSO
DIEGO CARLOS MARTINS GAYOSO

Compartilhe

O que é componente?

Imagine que você aguardou por meses pelo show da sua banda favorita, e quando chega o grande dia, o show é cancelado, pois um dos membros não pode comparecer. Esse membro pode ser o vocalista, guitarrista ou baterista, importante para que a banda exista, pois só assim conseguem fazer os shows e produzir suas músicas. O mesmo acontece no Angular, pois todo o desenvolvimento de uma aplicação é baseado em componentes, e cada um é importante para uma aplicação.

Componente é uma parte da composição de um todo, algo que compõe ou ajuda na composição de algo, por exemplo um baterista de uma banda. Já no desenvolvimento de softwares, é descrito como uma unidade de uma aplicação que junta de outras unidades fazem parte de um sistema maior. E a construção de vários componentes é chamado de componentização.

A componentização é algo útil pois permite a reutilização de trechos de código, isolamento de contexto, diminuição de tags das páginas, melhor leitura do código e padronização do projeto. Frameworks como, React e Vue utilizam esse método na construção de aplicações. Mas hoje você verá como isso se aplica no Angular.

Banner promocional da Alura, com um design futurista em tons de azul, apresentando o texto "Já sabe quais os próximos passos para seus estudos em Front-end? O Guia de Carreira em Front-end vai te ajudar nisso". À direita, está a foto de um jovem sorridente olhando para a esquerda do banner, ao lado de uma lista de tópicos oferecidos pelo guia, como "Principais cursos e formações da Alura nessa área", "Caminhos para carreira Front-end Angular e React", "Como migrar do Front-end para Back-end" e "Dicas de especialistas na área". No canto inferior direito, há um ícone de download e o texto "Baixe gratuitamente".

Segundo a documentação do Angular, o componente é o principal bloco de construção para aplicativos, e é composto por um template, um estilo e uma classe. É no template que encontraremos toda a estrutura HTML, a árvore DOM do componente. Já o estilo é onde será feita a estilização, e a classe onde é definido o comportamento e a lógica feita em Typescript.

Para configurar um componente, no arquivo TS é passado o decorador @Component, importado da lib ‘@angular/core’. Esse decorador é um método que recebe um objeto com os metadados como parâmetro. É criado um seletor, que será usado como tag HTML em outro template, o template passando o caminho do arquivo HTML, mas pode ser passado inline, e o arquivo de folha de estilo ou, assim como o template, passado inline.

import { Component } from '@angular/core';
 
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'sobre-componente';
}

Também temos a classe onde adicionamos propriedades e comportamentos ao componente.

Para ficar mais claro, crie uma nova aplicação com o Angular CLI, ng new sobre-componente. Não precisa de App Routing e o estilo fica à sua escolha. Com o projeto criado, serão gerados vários arquivos, dentre eles uma pasta chamada app. Nesta pasta estão os arquivos do AppComponent, principal componente da aplicação. É por meio do seletor deste componente que é passado para o index.html que toda aplicação vai poder ser vista pelo usuário.

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Sobre Componente</title>
  <base href="/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <!-- Tag AppComponent -->
  <app-root></app-root>
</body>
</html>

Com auxílio do Angular CLI, crie um novo componente usando o comando ng generate component botao ou usando abreviação ng g c botao, e veja o que acontece. Abaixo podemos ver o que o comando realizou. Os arquivos HTML, CSS e Typescript gerados e uma modificação no AppModule, no caso a declaração do novo componente.

$ ng g c components/botao
CREATE src/app/components/botao/botao.component.html (20 bytes)
CREATE src/app/components/botao/botao.component.spec.ts (619 bytes)
CREATE src/app/components/botao/botao.component.ts (271 bytes)     
CREATE src/app/components/botao/botao.component.css (0 bytes)      
UPDATE src/app/app.module.ts (553 bytes)

Após ser criado, o arquivo TS do BotaoComponent é bem parecido com a do AppComponent.

import { Component, OnInit } from '@angular/core';
 
@Component({
  selector: 'app-botao',
  templateUrl: './botao.component.html',
  styleUrls: ['./botao.component.css']
})
export class BotaoComponent implements OnInit {
 
  constructor() { }
 
  ngOnInit(): void {
  }
 
}

Todo componente precisa ser declarado em um módulo para poder ser utilizado na aplicação.

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
 
import { AppComponent } from './app.component';
import { BotaoComponent } from './botao/botao.component';
 
@NgModule({
  declarations: [
    AppComponent,
    BotaoComponent,
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Para utilizar o componente botão que você criou, use o seletor 'app-botao', e insira no template do AppComponent.

<header >
  <div class="container">
   <h4>
     Component Botão - Alura
   </h4>
  </div>
</header>
<section class="container">
  <app-botao></app-botao>
</section>

E com um pouco de estilização o resultado é esse:

Aplicação em Angular com uma barra azul na parte superior com o texto “Componentes com Angular”, e logo abaixo, em um fundo branco, um botão cinza com o texto “Botão” na cor branca.

E esse componente pode ser reutilizado várias vezes.

Aplicação em Angular de cores azul e branca, no cabeçalho está escrito Componentes com Angular e no corpo da aplicação existem 3 botões cinza com a palavra Botão.

<header >
  <div class="container">
   <h4>
     Componentes com Angular
   </h4>
  </div>
</header>
<section class="container">
  <app-botao></app-botao>
  <app-botao></app-botao>
  <app-botao></app-botao>
  <app-botao></app-botao>
</section>

Quando criamos um componente, o objetivo é fazer com que ele possa ser reutilizado em outras partes do código, para isso é necessário deixar esse botão o mais flexível possível. Para isso, vamos usar o decorator @Input(), que permite a entrada de dados do componente pai.

export class BotaoComponent {
  @Input() btnConfigs: any;
  constructor() { }
}

Agora no componente pai, no caso o AppComponent, vamos criar objetos contendo um título para o botão e um estilo.

export class AppComponent {
  title = 'sobre-componente';
  primary = {
      titulo: 'Editar',
      styles: { backgroundColor: '#007bff' }
  };
  secondary = {
    titulo: 'Desabilitado',
    styles: { backgroundColor: '#6c757d' }
  };
  success = {
    titulo: 'Salvar',
    styles: { backgroundColor: '#28a745' },
  };
  danger = {
    titulo: 'Deletar',
    styles: { backgroundColor: '#dc3545' }
  };
}

Com as propriedades prontas, vamos até o template onde criamos os botões e criar um atributo property binding onde o btnConfigs vai receber o objeto que criamos no AppComponent.

<section class="container">
  <app-botao [btnConfigs]="primary"></app-botao>
  <app-botao [btnConfigs]="secondary"></app-botao>
  <app-botao [btnConfigs]="success"></app-botao>
  <app-botao [btnConfigs]="danger"></app-botao>
</section>

Aplicação em Angular de cores azul e branca, no cabeçalho está escrito Componentes com Angular e no corpo da aplicação existem 4 botões de cores diferentes na posição vertical, o primeiro está é azul e está escrito Editar, o segundo é cinza e está escrito Desabilitar, o terceiro é verde e está escrito Salvar e o quarto é vermelho e está escrito Deletar.

Com as configurações chegando no BotaoComponent, podemos usá-las na estrutura do botão, colocando o estilo e o título. No HTML, vamos usar o property binding no ngStyle para receber o valor da propriedade que recebemos pelo @Input() e fazer uma interpolação para o título. E já vamos criar um evento de click para chamar o método alert.

<button
  class="button"
  [ngStyle]="btnConfigs.styles"
  (click)="alert()" >
  {{btnConfigs.titulo}}
</button>

O evento alert vai mostrar uma mensagem com o título do botão.

export class BotaoComponent {
  @Input() btnConfigs: any;
  constructor() { }
  alert() {
    alert(this.btnConfigs.titulo);
  }
}

E esse será o resultado.

Imagem com os mesmos 4 botões, mas com um pop-up com o título do botão clicado, no caso Editar.

Conclusão

O componente é uma das partes mais importantes de uma aplicação Angular, eles são os elementos que possibilitam criar funcionalidades da view. Conhecemos como criá-los e como são estruturados. Vimos também como utilizá-los, deixando a responsabilidade de estilização e título para o componente pai, e como adicionar um evento simples. Espero que a partir daqui você consiga explorar cada vez mais o universo Angular.

Quer utilizar esse código para explorar o que aprendeu? Clica aqui para baixar o projeto e mergulhar ainda mais no mundo do Angular!

DIEGO CARLOS MARTINS GAYOSO
DIEGO CARLOS MARTINS GAYOSO

Brasiliense, apaixonado por games e programação.

Veja outros artigos sobre Front-end