🔄 مميز

NgRx

مكتبة إدارة الحالة لـ Angular (Angular State Management)

(4/5)
👁️ 4 مشاهدة
📅 02 Jul 2026
🅰️ Angular

مستوى الخبرة المطلوب:

⚡ متوسط 🚀 محترف 🏢 مؤسسي
🔗 زيارة الموقع الرسمي
4
تقييم المستخدمين
التصنيف 🔄 State-Management
المشاهدات 4
تاريخ الإضافة 02/07/2026
آخر تحديث 02/07/2026

📖 الوصف

NgRx هي مجموعة مكتبات لإدارة الحالة في Angular مستوحاة من Redux. تُقدم نهج reactive باستخدام RxJS لإدارة state complex applications. تتضمن Store, Effects, Entity, Router Store, و Component Store. NgRx مُصممة خصيصاً لـ Angular وتُقدم integration عميق مع Angular Dependency Injection و RxJS. تُقدم حلا...

🎯 يستخدم في

مجالات استخدام هذه الأداة

State management في تطبيقات Angular

Applications مع complex state logic

Enterprise applications بـ Angular

Data caching و side effects

State synchronization مع API

المميزات

أبرز مميزات هذه الأداة

Angular-native (يعمل مع DI و RxJS)

Reactive programming (RxJS-based)

ComponentStore للـ local state

Entity adapters للبيانات

Router store integration

Effects للـ side effects

Strict TypeScript

DevTools (Redux DevTools)

Enterprise-grade

⚠️ العيوب

نقاط يجب مراعاتها

×

boilerplate كبير

×

منحنى تعليمي صعب

×

معقد للمشاريع الصغيرة

×

يحتاج فهم RxJS

×

أقل مرونة من البدائل

🔄 البدائل

أدوات بديلة يمكنك استخدامها

RxJS (بدون NgRx)
Akita
Angular Signals

💻 مثال على الاستخدام

كيفية استخدام هذه الأداة

Example Code
// actions/user.actions.ts
import { createAction, props } from '@ngrx/store';
import { User } from '../models/user.model';

export const loadUsers = createAction('[User] Load Users');
export const loadUsersSuccess = createAction(
  '[User] Load Users Success',
  props<{ users: User[] }>()
);
export const loadUsersFailure = createAction(
  '[User] Load Users Failure',
  props<{ error: Error }>()
);

// reducers/user.reducer.ts
import { createReducer, on } from '@ngrx/store';

export const initialState: UserState = {
  users: [],
  loading: false,
  error: null,
};

export const userReducer = createReducer(
  initialState,
  on(loadUsers, (state) => ({ ...state, loading: true })),
  on(loadUsersSuccess, (state, { users }) => ({
    ...state,
    users,
    loading: false,
  })),
  on(loadUsersFailure, (state, { error }) => ({
    ...state,
    error,
    loading: false,
  }))
);

// effects/user.effects.ts
import { Injectable } from '@angular/core';
import { Actions, createEffect, ofType } from '@ngrx/effects';
import { UserService } from '../services/user.service';
import { loadUsers, loadUsersSuccess, loadUsersFailure } from '../actions';
import { catchError, map, switchMap } from 'rxjs/operators';

@Injectable()
export class UserEffects {
  loadUsers$ = createEffect(() =>
    this.actions$.pipe(
      ofType(loadUsers),
      switchMap(() =>
        this.userService.getUsers().pipe(
          map((users) => loadUsersSuccess({ users })),
          catchError((error) => of(loadUsersFailure({ error })))
        )
      )
    )
  );

  constructor(
    private actions$: Actions,
    private userService: UserService
  ) {}
}

// components/users.component.ts
import { Component } from '@angular/core';
import { Store } from '@ngrx/store';
import { Observable } from 'rxjs';
import { User } from '../models/user.model';
import { selectUsers, selectLoading } from '../selectors';
import { loadUsers } from '../actions';

@Component({
  selector: 'app-users',
  template: `
    <div *ngIf="loading$ | async">جاري التحميل...</div>
    <ul>
      <li *ngFor="let user of users$ | async">
        {{ user.name }}
      </li>
    </ul>
    <button (click)="load()">إعادة تحميل</button>
  `
})
export class UsersComponent {
  users$: Observable<User[]>;
  loading$: Observable<boolean>;

  constructor(private store: Store) {
    this.users$ = this.store.select(selectUsers);
    this.loading$ = this.store.select(selectLoading);
  }

  load() {
    this.store.dispatch(loadUsers());
  }
}

📚 أدوات أخرى في State-Management

قد يعجبك أيضاً