В Angular управление состоянием компонентов и приложений может осуществляться несколькими способами. Основные подходы включают локальное состояние, сервисы, RxJS потоковые данные и сторонние библиотеки управления состоянием.
Каждый компонент может хранить свои данные внутри полей класса. Это простой способ, но неэффективный при необходимости синхронизации между несколькими компонентами.
export class CounterComponent {
counter = 0;
increment() {
this.counter++;
}
}
Недостаток — ограниченная масштабируемость и трудности при работе с общим состоянием.
Сервисы предоставляют общий доступ к данным между компонентами.
Использование @Injectable и dependency injection
обеспечивает единый источник истины.
@Injectable({ providedIn: 'root' })
export class CounterService {
counter = 0;
increment() {
this.counter++;
}
}
Компоненты подписываются на сервис:
export class CounterComponent {
constructor(public counterService: CounterService) {}
increment() {
this.counterService.increment();
}
}
Использование BehaviorSubject или
ReplaySubject позволяет создавать потоковое
состояние, на которое подписываются компоненты. Это решает
проблему синхронизации и упрощает управление асинхронными данными.
@Injectable({ providedIn: 'root' })
export class CounterService {
private counterSubject = new BehaviorSubject<number>(0);
counter$ = this.counterSubject.asObservable();
increment() {
this.counterSubject.next(this.counterSubject.value + 1);
}
}
Компоненты подписываются через async пайп:
<div>{{ counterService.counter$ | async }}</div>
<button (click)="counterService.increment()">Increment</button>
Для крупных приложений используются библиотеки:
Каждая библиотека подходит для своих сценариев: NgRx оптимален для больших проектов с большим количеством взаимодействий, Akita — для средних и крупных приложений с динамическими данными, NGXS — для упрощенных приложений, где важна декларативность.
При выборе метода управления состоянием учитывается: размер приложения, сложность взаимодействий между компонентами, необходимость масштабирования и отладки. Локальное состояние подходит для маленьких виджетов, сервисы и RxJS — для среднего уровня, а NgRx или Akita — для больших корпоративных приложений с сложной логикой.