DEV Community

Cover image for State Management in Angular with NgRx
Kartik Mehta
Kartik Mehta

Posted on • Edited on

State Management in Angular with NgRx

Introduction

Angular is an open-source framework for building web applications, developed and maintained by Google. It has gained popularity due to its robust features and efficient development environment. One of the many features of Angular is state management, which allows developers to manage the application's state efficiently. NgRx is one of the most popular state management libraries in Angular, providing a reactive approach to managing application state.

Advantages

  1. Centralized state management: NgRx allows for a centralized store for application state, making it easily accessible and manageable.

  2. Efficient debugging: With NgRx, developers can easily debug and trace the changes in the application state, making it easier to identify and fix any issues.

  3. Scalability: NgRx follows the Redux pattern, which enables the application to scale efficiently as it grows.

  4. Predictable state changes: By using actions and reducers, NgRx ensures that the state changes in the application are predictable, leading to a more stable and manageable codebase.

Disadvantages

  1. Learning curve: NgRx has a steep learning curve, and it may take some time for developers to get comfortable with the Redux pattern and its principles.

  2. Boilerplate code: NgRx requires developers to write a lot of boilerplate code, which can be time-consuming and tedious.

Features

NgRx Store

It is the central store for application state, and it can be accessed throughout the application using dependency injection.

import { StoreModule } from '@ngrx/store';
import { reducers } from './reducers';

@NgModule({
  imports: [
    StoreModule.forRoot(reducers),
  ],
})
export class AppModule {}
Enter fullscreen mode Exit fullscreen mode

This code snippet demonstrates how to integrate the NgRx Store into the Angular application module, using the StoreModule.forRoot() method to register your application's reducers.

Actions and Reducers

Actions represent the events that occur in the application, while reducers define how the state changes in response to these actions.

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

export const addBook = createAction(
  '[Book List] Add Book',
  props<{ bookId: string }>()
);

import { createReducer, on } from '@ngrx/store';
import { addBook } from './book.actions';

export const initialState = { books: [] };

export const bookReducer = createReducer(
  initialState,
  on(addBook, (state, { bookId }) => ({
    ...state,
    books: [...state.books, bookId],
  }))
);
Enter fullscreen mode Exit fullscreen mode

In this example, an action for adding a book to a list is defined along with a reducer that handles this action by updating the state.

Effects

It is a middleware that allows for side effects such as fetching data from APIs and updating state in the store.

import { Injectable } from '@angular/core';
import { Actions, ofType, createEffect } from '@ngrx/effects';
import { of } from 'rxjs';
import { map, mergeMap, catchError } from 'rxjs/operators';
import { BooksService } from '../books.service';
import * as BookActions from './book.actions';

@Injectable()
export class BookEffects {

  loadBooks$ = createEffect(() => this.actions$.pipe(
    ofType(BookActions.loadBooks),
    mergeMap(() => this.booksService.getAll()
      .pipe(
        map(books => BookActions.loadBooksSuccess({ books })),
        catchError(error => of(BookActions.loadBooksFailure({ error })))
      ))
    )
  );

  constructor(
    private actions$: Actions,
    private booksService: BooksService
  ) {}
}
Enter fullscreen mode Exit fullscreen mode

This snippet demonstrates how to use NgRx Effects to handle asynchronous operations like data fetching.

Conclusion

State management with NgRx in Angular is a powerful tool that allows developers to efficiently manage the state of their applications. While it has some disadvantages, its advantages, such as centralized state management and predictable state changes, make it a popular choice among Angular developers. With NgRx, developers can build scalable and maintainable applications that provide a smooth user experience.

Top comments (0)