在Angular中,当使用ChangeDetectionStrategy.OnPush策略时,组件只会在输入属性发生变化或自身事件(例如点击按钮)触发时重新渲染。
但是有时输入属性发生变化时,组件却没有重新渲染。这可能是因为输入属性不是引用类型,而是一个新的对象,导致无法触发变化检测。
解决方法是使用不可变对象,例如通过使用Immutable.js或Angular中的不可变数据结构来创建新的对象。
以下是一个示例,演示了如何使用不可变对象来解决这个问题:
// 使用不可变对象
import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; import { List } from 'immutable';
@Component({
selector: 'app-person',
template: Name: {{ person.name }} Age: {{ person.age }}
,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class PersonComponent {
private _person = List([]);
@Input() set person(value) { this._person = List([value]); }
get person() { return this._person.get(0); } }