面试题答案
一键面试潜在问题
- 性能问题:每次
ngFor
循环重新渲染时,ngIf
也会重新检查条件,增加额外计算开销。例如在一个大数据列表中,频繁的条件检查会导致性能下降。 - 渲染顺序问题:
ngIf
会在ngFor
之前执行,如果ngIf
条件不满足,ngFor
根本不会渲染,这可能导致数据绑定和预期不一致。
优化方法
- 在父级元素使用
ngIf
:将ngIf
移到包含ngFor
的父级元素上,这样先判断ngIf
条件,只有条件满足时才会渲染ngFor
,减少不必要的循环。 - 使用
ng-container
:利用ng-container
来包裹ngFor
和ngIf
,保持DOM结构清晰,同时避免不必要的元素创建。
代码示例
优化前(存在潜在问题)
<ul>
<li *ngFor="let item of items" *ngIf="item.isVisible">
{{ item.name }}
</li>
</ul>
优化方法1:在父级元素使用ngIf
<div *ngIf="shouldRenderItems">
<ul>
<li *ngFor="let item of items">
{{ item.name }}
</li>
</ul>
</div>
在组件类中:
import { Component } from '@angular/core';
@Component({
selector: 'app-example',
templateUrl: './example.component.html',
styleUrls: ['./example.component.css']
})
export class ExampleComponent {
items = [
{ name: 'Item1', isVisible: true },
{ name: 'Item2', isVisible: false },
{ name: 'Item3', isVisible: true }
];
shouldRenderItems = true;
}
优化方法2:使用ng-container
<ng-container *ngIf="shouldRenderItems">
<ul>
<li *ngFor="let item of items">
{{ item.name }}
</li>
</ul>
</ng-container>
在组件类中同样有:
import { Component } from '@angular/core';
@Component({
selector: 'app-example',
templateUrl: './example.component.html',
styleUrls: ['./example.component.css']
})
export class ExampleComponent {
items = [
{ name: 'Item1', isVisible: true },
{ name: 'Item2', isVisible: false },
{ name: 'Item3', isVisible: true }
];
shouldRenderItems = true;
}