📋 Cheatsheet: Ciclos de Vida en Angular

🔄 Orden de Ejecución

1. constructor          → Instanciación del componente
2. ngOnChanges         → Cada cambio en @Input
3. ngOnInit            → Una vez al inicializar
4. ngDoCheck           → En cada ciclo de detección
5. ngAfterContentInit  → Una vez tras inicializar contenido
6. ngAfterContentChecked → Tras verificar contenido
7. ngAfterViewInit     → Una vez tras inicializar vista
8. ngAfterViewChecked  → Tras verificar vista
9. ngOnDestroy         → Antes de destruir componente

⚡ Guía Rápida de Uso

Hook Cuándo usarlo Ejemplo común
constructor Inyección de dependencias Inicializar servicios
ngOnChanges Detectar cambios en @Input Actualizar UI cuando cambian props
ngOnInit Inicialización + llamadas HTTP Cargar datos del servidor
ngDoCheck Detección personalizada Cambios en objetos/arrays
ngAfterContentInit Contenido proyectado listo Verificar componentes hijos
ngAfterViewInit DOM disponible Inicializar librerías (Chart.js)
ngOnDestroy Limpieza antes de destruir Cancelar suscripciones

✅ Buenas Prácticas

❌ Errores a Evitar

🆕 Angular 17: Nuevos Hooks de Renderizado

// afterNextRender: Se ejecuta UNA VEZ después del próximo render
afterNextRender(() => {
  console.log('DOM renderizado por primera vez');
  // Ideal para inicialización única
});

// afterRender: Se ejecuta CADA VEZ que se renderiza
afterRender(() => {
  console.log('DOM actualizado');
  // Ideal para monitoreo continuo
});

💡 Patrón de Limpieza con Observables

import { Subject, takeUntil } from 'rxjs';

export class MiComponente implements OnInit, OnDestroy {
  private destroy$ = new Subject<void>();

  ngOnInit() {
    this.miServicio.getData()
      .pipe(takeUntil(this.destroy$))
      .subscribe(data => console.log(data));
  }

  ngOnDestroy() {
    this.destroy$.next();
    this.destroy$.complete();
  }
}

🎯 Casos de Uso Específicos