面试题答案
一键面试性能优化
- 减少不必要的计算
- 将复杂计算提取到组件类中:如果插值表达式中有复杂的计算逻辑,如数学运算、数组处理等,将这些计算提前在组件的TypeScript代码中进行,然后在插值表达式中直接使用计算结果。例如:
// 在组件类中 export class MyComponent { data = [1, 2, 3, 4, 5]; sum: number; constructor() { this.sum = this.data.reduce((acc, val) => acc + val, 0); } }
<!-- 在模板中 --> <div>Sum of data: {{sum}}</div>
- 使用纯管道:对于一些需要对数据进行转换的操作,使用纯管道。纯管道只有当它的输入值发生变化时才会重新计算,而不是每次变更检测都计算。例如,格式化日期可以使用自定义的纯管道:
import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'dateFormat', pure: true }) export class DateFormatPipe implements PipeTransform { transform(value: Date, format: string): string { // 日期格式化逻辑 return formattedDate; } }
<div>{{myDate | dateFormat:'yyyy - MM - dd'}}</div>
- 减少变更检测
- 使用
OnPush
变更检测策略:将组件的变更检测策略设置为OnPush
。这样,只有当组件的输入属性发生引用变化、组件接收到事件(如用户点击等)或Observable发出新值时,才会触发该组件及其子组件的变更检测。例如:
import { Component, ChangeDetectionStrategy } from '@angular/core'; @Component({ selector: 'app - my - component', templateUrl: './my - component.html', changeDetection: ChangeDetectionStrategy.OnPush }) export class MyComponent { // 组件逻辑 }
- 避免在插值表达式中使用函数调用:每次变更检测时,插值表达式中的函数都会被调用。如果函数有副作用或者计算开销大,会影响性能。尽量将函数调用的结果缓存起来。
- 使用
安全角度防止恶意脚本注入攻击
- 原理:插值表达式在渲染时会将数据插入到DOM中。如果直接插入未经过安全处理的用户输入数据,恶意用户可以构造包含JavaScript脚本的输入,当表达式渲染时,脚本就会在页面中执行,从而导致XSS(跨站脚本攻击)。
- 具体措施
- 使用
DomSanitizer
:Angular提供了DomSanitizer
服务来对数据进行安全处理。例如,如果要在插值表达式中显示HTML内容,可以这样做:
import { Component } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform - browser'; @Component({ selector: 'app - my - component', templateUrl: './my - component.html' }) export class MyComponent { htmlContent: SafeHtml; constructor(private sanitizer: DomSanitizer) { const userInput = '<script>alert("XSS")</script>'; this.htmlContent = this.sanitizer.bypassSecurityTrustHtml(userInput); } }
<div [innerHTML]="htmlContent"></div>
- 对用户输入进行验证和过滤:在将用户输入用于插值表达式之前,在组件类中对输入进行验证和过滤,确保输入不包含恶意脚本。例如,只允许输入字母和数字:
import { Component } from '@angular/core'; @Component({ selector: 'app - my - component', templateUrl: './my - component.html' }) export class MyComponent { userInput: string; sanitizedInput: string; constructor() { this.userInput = '<script>alert("XSS")</script>'; this.sanitizedInput = this.userInput.replace(/[^\w]/g, ''); } }
<div>{{sanitizedInput}}</div>
- 使用