我在我的項目中使用NGRX,並且在不斷地重新渲染組件時遇到問題。 商店每次產生全新的對象,如果商店數據相同,我不想重新渲染我的組件。我改改呈現組件檢測到ChangeDetectionStrategy.OnPush
lodash記憶化(_.memoization
),但它不工作的商店Angular 2 Redux不斷在NgFor中重新渲染
export interface CardsState {
cardsA: CardA[];
cardsB: CardB[];
cardsC: CardC[];
}
然後映射存儲狀態,結構,這個
const entities = [{
cards: {
cardsB: [
{}
]
}
}];
,並試圖的
國家防止每當店鋪通過記錄變更時重新呈現cardsB
物品
export const memoizeCardBFunc = _.memoize((cardB: CardB): CardB => {
return _.cloneDeep(cardB);
}, (cardB: CardB) => cardB.entityType + cardB.entityId);
在我的智能組件,我有下一個HTML
<div *ngFor="let entity of entities | async">
<div *ngFor="let cardB of entity.cards.cardsB">
<card-b [cardStateModel]="cardB"></card-b>
</div>
</div>
向我吃驚的是它正確與一個ngFor工作,但如果我有兩個ngFor它不工作!
<div *ngFor="let cardB of entity.cards.cardsB">
<card-b [cardStateModel]="cardB"></card-b>
</div>
我已經連續2天過了,它會讓我失望,請幫助!
我不是英語母語的人,對錯誤感到抱歉。
謝謝!
我不確定你爲什麼或者如何使用_.memoize和_.cloneDeep,但是這聽起來像是你的減速器出了問題。如果您的商店數據保持不變,則不應首先返回新對象。 – matmo
@matmo @Jonnysai這是一個與我的問題https://plnkr.co/edit/gbjdubPeZQXo7j6L3E6w?p=preview的蹲點。不適用於內部ngFor。你可以刪除第一個ngFor和第二個改變到'* ngFor =「讓cardB的實體[0] .cards.cardsB; trackBy:trackByB」'並且它工作。我需要內部ngFor( –
似乎你需要一個trackBy在外部ngFor – matmo