Introduction
Angular has always been one of the strongest frameworks for building enterprise-grade web applications.
But until now, its reactivity model (based on change detection with Zone.js) had certain limitations — especially in large-scale or performance-heavy applications.
That’s where Angular Signals come in.
Introduced in Angular v16, Signals provide a modern, predictable, and efficient way to handle reactive state management — without needing external libraries like RxJS for everything.
In this article, we’ll break down what Signals are, how they work, and how you can use them to make your Angular apps faster, cleaner, and more maintainable.
What Are Signals in Angular?
A Signal is a special kind of variable that reacts automatically when its value changes.
It holds a value, and whenever that value updates, Angular automatically updates the parts of the UI that depend on it.
Think of Signals as state containers that are:
Reactive (they notify when changed)
Synchronous
Simple to read and write
Zone.js independent
🧠 Simple Example
import { Component, signal } from '@angular/core';
@Component({
selector: 'app-counter',
template: `
<h2>{{ count() }}</h2>
<button (click)="increase()">Increase</button>
`
})
export class CounterComponent {
count = signal(0);
increase() {
this.count.update(v => v + 1);
}
}
✅ Here’s what happens:
signal(0)creates a reactive state variable namedcount.count()reads its value.When
increase()updates it, Angular automatically re-renders only that part of the UI.
No need for ChangeDetectorRef, no need for Zone.js — Angular does it smartly.
Why Use Signals?
Traditional Angular apps use Zone.js and RxJS for state updates. While RxJS is powerful, it can feel complex for simple reactivity needs.
Signals simplify this by giving you:
Cleaner syntax
Automatic reactivity
Better performance
No memory leaks
Perfect fit for Zoneless Angular
Different Ways to Use Signals
1. Read and Write
const name = signal('Rajesh');
console.log(name()); // 'Rajesh'
name.set('Gamee Rajeshbhai');
console.log(name()); // 'Gamee Rajeshbhai'2. Update
const counter = signal(1);
counter.update(value => value + 1);
This is a common pattern in counters, pagination, or quantity updates.
3. Computed Signals
You can create computed signals that depend on other signals.
const firstName = signal('Rajesh');
const lastName = signal('Gami');
const fullName = computed(() => `${firstName()} ${lastName()}`);
console.log(fullName()); // Rajesh GamiWhen either firstName or lastName changes,fullName automatically recalculates — no manual code required!
4. Effects
Effects are side operations that run whenever a signal changes — like calling an API or logging data.
effect(() => {
console.log('Counter changed:', counter());
});
If counter updates anywhere in the app, this effect will run automatically.

Join the conversation! Your thoughts help the community grow.