Hello to all, welcome to therichpost.com. In this post, I will tell you, Angular 16+ Data Sharing | State Management Between Components Using NGRX.
Angular 17 came and if you are new then please check below links:
Here is the code snippet and please use it carefully:
1. Very first, you need run below commands into your terminal to get angular 17 fresh setup:
Also you have latest nodejs installed on your system
npm install -g @angular/cli //Setup Angular17 atmosphere ng new angularngrx //Install New Angular App /**You need to update your Nodejs also for this verison**/ cd angularngrx //Go inside the Angular 17 Project
2. Now run below commands into your terminal to get ngrx and bootstrap modules into your angular 17 application:
I use mostly use bootstrap to make application looks good
npm install bootstrap --save npm install @ngrx/store --save
3. Now add below code into your angular.json file:
"styles": [ ... "node_modules/bootstrap/dist/css/bootstrap.min.css", ], ...
4. Now you have to create counter.actions.ts file inside src/app folder and add below code into that file:
import { createAction } from '@ngrx/store'; export const increment = createAction('[Counter Component] Increment'); export const decrement = createAction('[Counter Component] Decrement'); export const reset = createAction('[Counter Component] Reset');
5. Now create counter.reducer.ts file inside src/app folder and add below code into that file:
import { createReducer, on } from '@ngrx/store'; import { increment, decrement, reset } from './counter.actions'; export const initialState = 0; const _counterReducer = createReducer(initialState, on(increment, state => state + 1), on(decrement, state => state - 1), on(reset, state => 0), ); export function counterReducer(state:any, action:any) { return _counterReducer(state, action); }
6. Now run below command into your terminal to create new component:
ng g c componentsecond
7. Now add below code into your src/app/app.module.ts file:
... import { StoreModule } from '@ngrx/store'; import { counterReducer } from './counter.reducer'; import { Routes, RouterModule } from '@angular/router'; const appRoutes: Routes = [ { path: 'secondcomponent', component: ComponentsecondComponent } ]; ... imports: [ ... StoreModule.forRoot({ count: counterReducer }), RouterModule.forRoot( appRoutes, { enableTracing: true } // <-- debugging purposes only ) ],
8. Now add below code into src/app/app/component.ts file:
... import { Store, select } from '@ngrx/store'; import { Observable } from 'rxjs'; import { increment, decrement, reset } from './counter.actions'; ... export class AppComponent { ... count$: Observable<number>; constructor( private store: Store<{ count: number }>){ this.count$ = store.pipe(select('count')); } increment() { this.store.dispatch(increment()); } decrement() { this.store.dispatch(decrement()); } reset() { this.store.dispatch(reset()); } }
9. Now add below into src/app/app.component.html file:
<nav class="navbar navbar-expand-sm bg-light"> <!-- Links --> <ul class="navbar-nav"> <li class="nav-item"> <a class="nav-link" [routerLink]="['/']">Home</a> </li> <li class="nav-item"> <a class="nav-link" [routerLink]="['/secondcomponent']">Second Component</a> </li> </ul> </nav> <div class="container text-center"> <h1 class="mt-5 mb-5">Angular 17 NGRX Working Example with multiple Components</h1> <button class="btn btn-primary mb-5 mt-5" id="increment" (click)="increment()">Increment</button> <div>Current Count: {{ count$ | async }}</div> <button class="btn btn-primary mb-5 mt-5 mr-5" id="decrement" (click)="decrement()">Decrement</button> <button class="btn btn-primary" id="reset" (click)="reset()">Reset Counter</button> <router-outlet></router-outlet> </div>
10. Now add below into your src/app/componentsecond/componentsecond.component.ts file:
... import { Store, select } from '@ngrx/store'; import { Observable } from 'rxjs'; export class ComponentsecondComponent implements OnInit { ... count$: Observable<number>; constructor( private store: Store<{ count: number }>) { this.count$ = store.pipe(select('count')); } }
11. Finally add below into your src/app/componentsecond/componentsecond.component.html file:
<div>Current Count: {{ count$ | async }}</div>
This is it and don’t forget to run ng serve command in the end. If you have any kind of query then please do comment below.
Note:
The main purpose of this pot is to tell you, how to easily share data between components in angular 17.
Jassa
Thanks
Recent Comments