Стратегия изменений OnPush в Angular предназначена для
оптимизации работы системы обнаружения изменений (change detection). По
умолчанию Angular использует Default стратегию,
проверяя весь компонентный дерево при любом событии, что может быть
ресурсоёмко. OnPush ограничивает количество проверок,
значительно повышая производительность.
Компонент с ChangeDetectionStrategy.OnPush
проверяется только если:
@Input()) изменились по ссылке.markForCheck() или
detectChanges() через ChangeDetectorRef.Изменения внутри объекта или массива не обнаруживаются автоматически, если ссылка объекта не изменилась:
@Input() data: any[];
// Это не вызовет повторного рендера
this.data.push(newItem);
// Нужно создавать новый объект
this.data = [...this.data, newItem];import { Component, ChangeDetectionStrategy, Input } from '@angular/core';
@Component({
selector: 'app-item',
template: `<div>{{ item.name }}</div>`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ItemComponent {
@Input() item: { name: string };
}
ItemComponent только если
изменится объект item целиком.При использовании Observables и async
пайпа, OnPush интегрируется идеально:
<div *ngFor="let item of items$ | async">
<app-item [item]="item"></app-item>
</div>
В случае сложных сценариев, когда данные изменяются внутри компонента
без смены ссылки, используется ChangeDetectorRef:
constructor(private cdr: ChangeDetectorRef) {}
updateData() {
this.data.push(newItem);
this.cdr.markForCheck(); // Обновление OnPush компонента
}
Это позволяет сохранить преимущества OnPush, не жертвуя
реактивностью интерфейса.
Преимущества:
Ограничения:
Эти два механизма — временные функции анимаций и OnPush стратегия изменений — являются ключевыми инструментами Angular для создания производительных и визуально плавных интерфейсов. Они требуют понимания внутренних принципов фреймворка и дисциплины в управлении состоянием компонентов и их визуальными переходами.