Referencia de Decoradores
La referencia de decoradores en Angular es una guía esencial para el desarrollo de aplicaciones modernas y SPA, ya que los decoradores permiten añadir metadatos a clases, métodos y propiedades, definiendo su comportamiento dentro del framework. Estos metadatos facilitan la creación de componentes reutilizables, la gestión del estado, la organización del flujo de datos y el control del ciclo de vida de los elementos de la interfaz.
Los decoradores más utilizados son @Component, @Directive, @Pipe, @Injectable y @NgModule. @Component define un componente de interfaz de usuario, @Directive permite crear directivas personalizadas que manipulan el DOM, @Pipe transforma datos en las plantillas, @Injectable habilita la inyección de dependencias y @NgModule estructura la aplicación en módulos funcionales. Decoradores adicionales como @Input y @Output facilitan la comunicación entre componentes, mientras que @ViewChild y @ContentChild permiten acceder a elementos hijos o contenido proyectado en plantillas.
Con esta referencia, el lector aprenderá a utilizar los decoradores correctamente, creando componentes escalables y optimizados, evitando errores comunes como prop drilling, re-renderizados innecesarios y mutaciones de estado. Esto permitirá desarrollar aplicaciones Angular seguras, eficientes y mantenibles, aplicando las mejores prácticas en proyectos reales y garantizando un flujo de datos claro y controlado.
Ejemplo Básico
typescriptimport { Component, Input } from '@angular/core';
@Component({
selector: 'app-user-card',
template: ` <div class="card"> <h2>{{ name }}</h2> <p>Edad: {{ 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;
}
En este ejemplo, el decorador @Component convierte la clase UserCardComponent en un componente funcional de Angular. El parámetro selector define el tag HTML para usar el componente, mientras que template y styles configuran su presentación visual. Los decoradores @Input permiten recibir datos del componente padre, evitando la necesidad de prop drilling.
Angular gestiona automáticamente el ciclo de vida del componente, incluyendo la inicialización, renderizado y destrucción. Los cambios en propiedades decoradas con @Input se reflejan automáticamente en la interfaz, minimizando re-renderizados innecesarios. Este ejemplo demuestra cómo los decoradores controlan el flujo de datos y el estado del componente, aplicable en proyectos reales de Angular para crear interfaces consistentes y reutilizables.
Ejemplo Práctico
typescriptimport { Component, Input, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'app-counter',
template: ` <div class="counter"> <h3>Contador: {{ 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>Contador Inteligente: {{ 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 inicializado con valor:', this.value);
}
ngOnChanges(changes: SimpleChanges) {
if (changes['value']) {
console.log('Valor cambiado:', changes['value'].currentValue);
}
}
increase() {
this.value++;
this.valueChange.emit(this.value);
}
decrease() {
this.value--;
this.valueChange.emit(this.value);
}
}
SmartCounterComponent combina @Input, @Output y los lifecycle hooks OnInit y OnChanges para gestionar el estado y actualizar la interfaz de manera reactiva. Los decoradores permiten la reutilización del componente y evitan prop drilling y re-renderizados innecesarios. Este enfoque optimiza el flujo de datos y la gestión del estado, fundamental para aplicaciones Angular escalables y mantenibles.
Las mejores prácticas incluyen usar @Input únicamente para datos necesarios y @Output para eventos. Evite mutaciones directas del estado y exceso de prop drilling. Para optimizar el rendimiento, utilice ChangeDetectionStrategy.OnPush. Angular DevTools permite monitorear ciclos de vida y EventEmitter. Un uso correcto de los decoradores asegura aplicaciones Angular seguras, rápidas y escalables.
📊 Referencia Completa
Angular Element/Method | Description | Syntax | Example | Notes |
---|---|---|---|---|
@Component | Define un componente | @Component({...}) | @Component({ selector:'app-demo', template:'...' }) | Decorador principal |
@Directive | Crea una directiva | @Directive({...}) | @Directive({ selector:'[highlight]' }) | Manipula el DOM |
@Pipe | Transforma datos | @Pipe({...}) | @Pipe({name:'capitalize'}) | Cambio de presentación |
@NgModule | Define un módulo | @NgModule({...}) | @NgModule({ declarations:[], imports:[] }) | Organiza la app |
@Injectable | Permite DI | @Injectable({...}) | @Injectable({ providedIn:'root' }) | Para inyección de dependencias |
@Input | Datos entrantes | @Input() prop:type | @Input() title:string | Recibe datos del padre |
@Output | Eventos de componente | @Output() event=new EventEmitter() | @Output() clicked=new EventEmitter() | Envía datos al padre |
@HostListener | Escucha eventos DOM | @HostListener('click') handler(){} | @HostListener('window:scroll') onScroll() | Bind de eventos |
@ViewChild | Acceso a hijo | @ViewChild(ChildComponent) child!:ChildComponent | Manipulación de hijo | |
@ContentChild | Acceso a contenido | @ContentChild(TemplateRef) tpl!:TemplateRef | Gestión de contenido proyectado | |
@HostBinding | Bind de propiedades | @HostBinding('class.active') isActive=true | Modificación dinámica DOM |
📊 Complete Angular Properties Reference
Property | Values | Default | Description | Angular Support |
---|---|---|---|---|
selector | string | none | Selector del componente | todas |
template | string | none | Plantilla del componente | 2+ |
styles | array | string[] | none | Estilos del componente |
providers | array | [] | Proveedores DI | 2+ |
inputs | array | [] | Lista @Input | 4+ |
outputs | array | [] | Lista @Output | 4+ |
animations | array | [] | Animaciones | 4+ |
changeDetection | string | 'Default' | Estrategia de Change Detection | 5+ |
encapsulation | string | 'Emulated' | Encapsulación CSS | 2+ |
standalone | boolean | false | Componente independiente | 14+ |
imports | array | [] | Importación de módulos | 14+ |
schemas | array | [] | Elementos personalizados permitidos | 9+ |
Dominar la referencia de decoradores permite crear componentes optimizados, reutilizables y escalables. Comprender el flujo de datos, la gestión del estado y los hooks del ciclo de vida asegura aplicaciones Angular eficientes. Se recomienda profundizar en Dependency Injection, lifecycle hooks avanzados, Change Detection y RxJS para manejar datos asíncronos y mejorar habilidades profesionales en Angular.
🧠 Pon a Prueba tu Conocimiento
Pon a Prueba tu Conocimiento
Ponte a prueba con este cuestionario interactivo y descubre qué tan bien entiendes el tema
📝 Instrucciones
- Lee cada pregunta cuidadosamente
- Selecciona la mejor respuesta para cada pregunta
- Puedes repetir el quiz tantas veces como quieras
- Tu progreso se mostrará en la parte superior