28 feb 2023 · Actualizado 15 jul 2026

Angular Signals: Guía Completa de Estado Reactivo

angularsignalsrxjsfrontendestado

Aprende Angular Signals: signal(), computed() y effect() para estado reactivo fino. La alternativa a BehaviorSubject con interop completa con RxJS.

Debido a la complejidad de la programación reactiva la curva de aprendizaje se vuelve demasiado compleja y abrumadora para personas que quieren iniciar con Angular, pero esto está a punto de cambiar

  1. Que es la reactividad de grano fino
  2. Como funcionan los signals
  3. Qué diferencia tiene de RxJs
  4. Como ayuda a facilitar el uso de Angular

Que es el manejo de estado de grano fino

La reactividad de grano fino es un paradigma de programación que permite la reevaluación automática del código en respuesta a cambios en los datos o el estado. En este paradigma, el código se divide en pequeñas unidades reactivas independientes que son sensibles a los cambios en sus datos de entrada. Cuando los datos de entrada cambian, estas unidades reactivas se vuelven a evaluar automáticamente, actualizando su salida en consecuencia.

La reactividad de grano fino se usa comúnmente en frameworks de programación como Solid.js, Vue.js y Svelte y parcialmente Angular, donde la interfaz de usuario se actualiza automáticamente en respuesta a los cambios en los datos subyacentes. En estos frameworks, los componentes de la interfaz de usuario se definen como unidades reactivas que se vuelven a evaluar en respuesta a los cambios en el estado de la aplicación.

La reactividad de grano fino puede mejorar el rendimiento y la capacidad de mantenimiento de aplicaciones complejas al reducir la necesidad de actualizaciones manuales de la interfaz de usuario y permitir un procesamiento de datos más eficiente. También puede ayudar a garantizar que la interfaz de usuario de la aplicación se mantenga coherente con los datos subyacentes en todo momento, lo que mejora la experiencia del usuario.

Como funcionan los signals

Imaginemos que tenemos una variable que contiene un valor así como las de toda la vida, lo interesante radica en que si el signal cambia también cambiará todo lo que de ese signal esto ahorra tiempos y recursos, ya que de esta manera no se consulta todo el árbol de componente para poder determinar si hay un cambio por ejemplo

Angular clásico:

@Component({ template: ` {{ personas }} <button (click)="agregarPersonas()">Agregar personas</button> `, }) export class AppComponent { personas = 0; agregarPersonas() { this.personas = 5; } }

Usando Signals:

import { signal, computed } from '@angular/core'; export class AppComponent { personas = signal(0); duplicarPersonas = computed(() => this.personas() * 2); agregarPersonas() { this.personas.update((count) => count + 1); } }

Usando RxJS:

personas$ = new BehaviorSubject(0); duplicarPersonas$ = this.personas$.pipe(map((personas) => personas * 2));

Nota la diferencia: la versión con computed() se lee como una función normal, no necesita suscripción y nunca tiene fugas de memoria. La versión con RxJS necesita un BehaviorSubject, un pipe, y un async pipe o una suscripción manual en la plantilla.

signal() vs. computed(): ¿cuál es la diferencia?

signal()computed()
ValorMutable — se asigna directamenteDerivado, de solo lectura
Cómo se modifica.set(valor) o .update(fn)Se recalcula automáticamente cuando cambian sus dependencias
Uso típicoFuente de verdad para el estado del componenteValores derivados de uno o más signals

Qué diferencia tiene de RxJS

La principal diferencia es que RxJS es una biblioteca específica para programación reactiva con streams, mientras que la reactividad de grano fino es un paradigma más general que se puede implementar con distintas técnicas — los signals son la implementación de Angular.

SignalsObservables (RxJS)
NaturalezaSíncronos, siempre tienen un valor actualModelan valores a lo largo del tiempo — pueden ser asíncronos
LecturaSe llaman directamente: personas(), sin suscripciónRequieren subscribe() o el pipe async
Ciclo de vidaNo completan, no requieren limpieza manualPueden completar o dar error; requieren unsubscribe()
Ideal paraEstado de componente, valores derivadosRespuestas HTTP, streams de WebSocket, eventos

No tienes que elegir entre uno u otro. toSignal() y toObservable() de @angular/core/rxjs-interop convierten entre ambos, así que las llamadas HTTP pueden seguir en RxJS mientras el estado de tu plantilla vive en signals.

Como ayuda a facilitar el uso de Angular

Al usar signals, las actualizaciones del DOM se manejan de forma más rápida y precisa. Los signals no son Observables: puedes leer su valor directamente, de forma síncrona, sin suscribirte — sin subscribe(), sin unsubscribe(), sin checklist de fugas de memoria.

Desde Angular 19, los signals son la opción recomendada por defecto para el estado de componente, y son la base sobre la que se construye el framework: la detección de cambios zoneless, los signals input() y Signal Forms se apoyan en este modelo de reactividad.

Ejemplos en vivo:


Los Signals van de la mano con la nueva sintaxis de plantillas — revisa Control Flow en Angular: @if, @for y @switch (Adiós ngIf) para la otra mitad de Angular declarativo.

Escrito por

Antonio Cárdenas

Google Developer Expert en Angular · Perfil GDE verificado · Perfil de Google Developers

Mi escritura técnica llega a más de 100,000 desarrolladores en inglés y español. He migrado aplicaciones Angular de producción desde la v8 hasta la v22, y mis habilidades agénticas de código abierto están destacadas en catálogos comunitarios como agentic-awesome-skills.

Preguntas frecuentes

Preguntas frecuentes

¿Qué son los Signals de Angular?

Los Signals de Angular son un sistema de reactividad de grano fino introducido en Angular 16. Un Signal es un contenedor de valor que notifica automáticamente a sus consumidores cuando cambia. Se accede a su valor llamándolo como función: miSignal(). Se crean con signal(valorInicial) y se modifican con .set() o .update().

¿En qué versión de Angular se introdujeron los Signals?

Los Signals se introdujeron como API experimental en Angular 16 (mayo 2023) y se estabilizaron como API pública en Angular 17. Desde Angular 19, son la forma recomendada de gestionar el estado reactivo en componentes, junto con NgRx SignalStore para estado global.

¿Los Signals reemplazan a RxJS en Angular?

No completamente. Los Signals reemplazan a RxJS para el estado local de componentes y valores derivados síncronos. RxJS sigue siendo ideal para flujos asíncronos complejos, peticiones HTTP y eventos de stream. Angular proporciona toSignal() y toObservable() para interoperabilidad entre ambos sistemas.

¿Cuál es la diferencia entre signal() y computed() en Angular?

signal() crea un valor reactivo mutable que puedes modificar con .set(nuevoValor) o .update(fn). computed() crea un valor derivado de solo lectura que se recalcula automáticamente cuando sus dependencias cambian. No puedes asignar un valor directamente a un computed — solo se actualiza cuando sus signals de entrada cambian.

¿Cómo usar Signals con async pipes y Observables existentes?

Usa toSignal(observable$) para convertir un Observable en un Signal. Esto gestiona automáticamente la suscripción y cancelación. Para el camino inverso, usa toObservable(miSignal) para obtener un Observable desde un Signal. Ambas utilidades están disponibles en @angular/core/rxjs-interop.

Sigue leyendo

¿Construyendo algo con Angular?

Escribo sobre arquitectura en Angular, Signals y el tooling a su alrededor — guías de migración, rutas reales de actualización y los detalles que la mayoría de artículos se saltan.

Ver todos los artículosAcerca de mí

Más del blog