Even with OnPush change detection, poor component design can lead to unnecessary re-renders. In this example, typing in the search input causes all cards to re-render.
@Component({
template:
<input [(ngModel)]="searchTerm">
<div *ngFor="let card of filteredCards">
{ card.title }
</div>
})
export class ProblematicComponent {
searchTerm = '';
cards: Card[] = [];
get filteredCards() {
return this.cards.filter(card =>
card.title.toLowerCase().includes(this.searchTerm.toLowerCase())
);
}
}
Type in the search box below and watch the console. Even though filtering only happens when you press Enter, notice how every card gets re-rendered on each keystroke.
Try typing and watch the render counts increase, even though the list hasn't filtered yet!
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing:
Renders: 2
Component rendered due to typing: