📋 محتويات الصفحة
📖 الوصف
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
أقل مرونة من البدائل
🔄 البدائل
أدوات بديلة يمكنك استخدامها
💻 مثال على الاستخدام
كيفية استخدام هذه الأداة
// 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
قد يعجبك أيضاً
Effector
مكتبة إدارة حالة reactive (Reactive State Management)
Jotai
⭐مكتبة إدارة حالة ذرية (Atomic State Management)
MobX
⭐مكتبة إدارة حالة تفاعلية (Reactive State Management)
Nano Stores
مكتبة إدارة حالة خفيفة (Tiny State Manager)
Pinia
⭐مكتبة إدارة الحالة الرسمية لـ Vue (Vue State Management)
Recoil
⭐مكتبة إدارة حالة ذرية (Atomic State Management)