Angular State Management (RxJS, NgRx) | asadmukhtar.info
Step-by-Step Guide to Setting Up Authentication in Laravel 12 with Breeze   |   Manual Authentication in Laravel 12: Step-by-Step Guide   |   How to Build a REST API in Laravel 12 with Sanctum   |   Laravel 12 CRUD Application with Image Upload   |   Laravel 12 Multi-Auth System: Admin & User Login   |   How to Integrate Stripe Payment Gateway in Laravel 12   |   Building a Role-Based Access Control (RBAC) in Laravel 12   |   How to Use Laravel 12 Queues and Jobs for Background Tasks   |   Laravel 12 Livewire CRUD Example with Validation   |   Email Verification and Password Reset in Laravel 12   |   How to Use Laravel 12 API with Vue.js 3   |   Laravel 12 AJAX CRUD with jQuery and Bootstrap   |   Laravel 12 Multi-Language Website Setup   |   React Best Practices for 2025: Performance, SEO, and Scalability   |   How to Build a Full-Stack MERN App: A Step-by-Step Guide   |   React State Management: Redux vs. Context API vs. Recoil   |   Server-Side Rendering (SSR) in React with Next.js for SEO   |   How to Optimize React Apps for Faster Load Times   |   Building a REST API with Node.js and Express for a React App   |   Integrating JWT Authentication in React and Node.js (MERN Stack)   |   Real-time Chat App with React, Node.js, and Socket.io   |   How to Deploy a MERN Stack Application on AWS or Vercel   |   Connecting React Frontend to a Node.js Backend with Axios   |   Laravel Implement Flash Messages Example   |   How to integrate Angular 19 with Node.js and Express for full-stack development   |   Best practices for connecting Angular 19 frontend with Laravel API   |   Step-by-step guide to upgrading an existing project to Angular 19   |   How to implement authentication in Angular 19 using JWT and Firebase   |   Optimizing server-side rendering in Angular 19 with route-level render modes   |   Using Angular 19 signals for state management in large applications   |   How to create standalone components in Angular 19 for modular architecture   |   Building a CRUD application in Angular 19 with MongoDB and Express   |   Implementing lazy loading in Angular 19 to improve performance   |   How to integrate Angular 19 with GraphQL for efficient data fetching   |   Vue 3 Composition API vs Options API: A Comprehensive Comparison   |   Fetching and Displaying Data from APIs in Vue.js with Axios   |   Building a Todo App in Vue.js with Local Storage Integration   |   Handling Forms and Validation in Vue.js Using VeeValidate   |   State Management in Vue.js Applications Using Vuex   |   10 Most Important Tasks Every MERN Stack Developer Should Master   |   How to Build a Full-Stack CRUD App with MERN Stack   |   Best Practices for Authentication & Authorization in MERN Stack   |   1. MEAN Stack vs. MERN Stack: Which One Should You Choose in 2025   |   Top 10 Node.js Best Practices for Scalable and Secure Applications   |   How to Build a REST API with Laravel and Node.js (Step-by-Step Guide)   |   Mastering Angular and Express.js for Full-Stack Web Development   |   Top 10 Daily Tasks Every Frontend Developer Should Practice   |   Essential Backend Development Tasks to Boost Your Coding Skills   |   Real-World Mini Projects for Practicing React.js Daily   |   Laravel Developer Task List: Beginner to Advanced Challenges   |   How to Assign Effective Tasks to Your Intern Developers   |   10 Must-Try Tasks to Master JavaScript Fundamentals   |   Practical CSS Challenges That Improve Your UI Design Skills   |   Top Tasks to Learn API Integration in React and Angular   |   Best Task Ideas for a 30-Day Web Development Challenge   |   Top Git and GitHub Tasks Every Developer Should Know   |   30-Day Task Plan for Web Development Interns   |   Weekly Task Schedule for Junior Developers in a Startup   |   How to Track Progress with Development Tasks for Interns   |   What Tasks Should You Give to Interns in a MERN Stack Project   |   Build These 5 Projects to Master React Routing   |   Task-Based Learning: Become a Full-Stack Developer in 90 Days   |   Daily Coding Tasks That Will Sharpen Your Logical Thinking   |   Top 7 Backend Task Ideas to Practice With Node.js and MongoDB   |  

1. Understanding State Management in Angular

State management refers to handling application data consistently across components. In Angular, the state can be:

  • Local State – Managed within a single component using @Input() and @Output().
  • Shared State – Shared between multiple components using services and RxJS.
  • Global State – Managed across the entire application using NgRx (Redux pattern).

2. Using RxJS for Local State Management

RxJS provides BehaviorSubject, which helps manage state reactively.

Create a Service for State Management

Run:

ng generate service state

Modify state.service.ts:

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';

@Injectable({
  providedIn: 'root',
})
export class StateService {
  private stateSource = new BehaviorSubject<string>('Initial State');
  currentState = this.stateSource.asObservable();

  updateState(newState: string) {
    this.stateSource.next(newState);
  }
}

Use the Service in a Component

Modify app.component.ts:

import { Component } from '@angular/core';
import { StateService } from './state.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent {
  currentState!: string;

  constructor(private stateService: StateService) {}

  ngOnInit() {
    this.stateService.currentState.subscribe((state) => {
      this.currentState = state;
    });
  }

  changeState() {
    this.stateService.updateState('Updated State');
  }
}

Modify app.component.html:

<h2>State: {{ currentState }}</h2>
<button (click)="changeState()">Update State</button>

3. Using NgRx for Global State Management

NgRx is a Redux-inspired library for managing state in Angular applications.

Install NgRx

Run:

ng add @ngrx/store
ng add @ngrx/effects

Define the State and Actions

Modify app.state.ts:

export interface AppState {
  message: string;
}

Modify app.actions.ts:

import { createAction, props } from '@ngrx/store';

export const updateMessage = createAction(
  '[App] Update Message',
  props<{ message: string }>()
);

Create Reducer

Modify app.reducer.ts:

import { createReducer, on } from '@ngrx/store';
import { updateMessage } from './app.actions';

export const initialState = { message: 'Initial NgRx State' };

const _appReducer = createReducer(
  initialState,
  on(updateMessage, (state, { message }) => ({ ...state, message }))
);

export function appReducer(state: any, action: any) {
  return _appReducer(state, action);
}

Register Store in app.module.ts

Modify app.module.ts:

import { Component } from '@angular/core';
import { Store } from '@ngrx/store';
import { updateMessage } from './app.actions';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent {
  message$ = this.store.select((state) => state.app.message);

  constructor(private store: Store) {}

  updateMessage() {
    this.store.dispatch(updateMessage({ message: 'Updated NgRx State' }));
  }
}

Use Store in a Component

Modify app.component.ts:

import { Component } from '@angular/core';
import { Store } from '@ngrx/store';
import { updateMessage } from './app.actions';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent {
  message$ = this.store.select((state) => state.app.message);

  constructor(private store: Store) {}

  updateMessage() {
    this.store.dispatch(updateMessage({ message: 'Updated NgRx State' }));
  }
}

Modify app.component.html:

<h2>State: {{ message$ | async }}</h2>
<button (click)="updateMessage()">Update State</button>

Conclusion

RxJS (BehaviorSubject) is great for local state management.
NgRx provides a structured way to manage global state in large applications.
Use RxJS for simple cases and NgRx when state management grows complex.
✔ Proper state management improves performance, scalability, and maintainability. 🚀