在Angular 11中,使用子数据对父模板进行消重可以通过多种方式实现,以下是几种常见的方法:
*ngFor
和trackBy
*ngFor
指令用于迭代数组,并且可以通过trackBy
函数来优化性能,避免不必要的DOM重绘。
// parent.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-parent',
templateUrl: './parent.component.html',
styleUrls: ['./parent.component.css']
})
export class ParentComponent {
items = [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 1, name: 'Item 1' }, // 重复项
{ id: 3, name: 'Item 3' }
];
trackByFn(index, item) {
return item.id;
}
}
<!-- parent.component.html -->
<ul>
<li *ngFor="let item of items; trackBy: trackByFn">{{ item.name }}</li>
</ul>
trackByFn
函数用于跟踪每个项的唯一标识符(在这个例子中是id
)。*ngFor
指令使用trackBy: trackByFn
来确保只有当项的标识符发生变化时,才会重新渲染该项。可以创建一个自定义管道来过滤重复项。
// unique.pipe.ts
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'unique'
})
export class UniquePipe implements PipeTransform {
transform(items: any[], key: string): any[] {
const uniqueItems = [];
const seen = new Set();
for (const item of items) {
if (!seen.has(item[key])) {
seen.add(item[key]);
uniqueItems.push(item);
}
}
return uniqueItems;
}
}
// parent.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-parent',
templateUrl: './parent.component.html',
styleUrls: ['./parent.component.css']
})
export class ParentComponent {
items = [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 1, name: 'Item 1' }, // 重复项
{ id: 3, name: 'Item 3' }
];
}
<!-- parent.component.html -->
<ul>
<li *ngFor="let item of items | unique:'id'">{{ item.name }}</li>
</ul>
UniquePipe
管道通过指定的键(在这个例子中是id
)来过滤重复项。*ngFor
指令结合unique
管道来显示唯一的项。可以将去重逻辑封装在一个服务中,并在组件中使用该服务。
// unique.service.ts
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class UniqueService {
uniqueItems(items: any[], key: string): any[] {
const uniqueItems = [];
const seen = new Set();
for (const item of items) {
if (!seen.has(item[key])) {
seen.add(item[key]);
uniqueItems.push(item);
}
}
return uniqueItems;
}
}
// parent.component.ts
import { Component } from '@angular/core';
import { UniqueService } from './unique.service';
@Component({
selector: 'app-parent',
templateUrl: './parent.component.html',
styleUrls: ['./parent.component.css']
})
export class ParentComponent {
items = [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 1, name: 'Item 1' }, // 重复项
{ id: 3, name: 'Item 3' }
];
constructor(private uniqueService: UniqueService) {}
getUniqueItems() {
return this.uniqueService.uniqueItems(this.items, 'id');
}
}
<!-- parent.component.html -->
<ul>
<li *ngFor="let item of getUniqueItems()">{{ item.name }}</li>
</ul>
UniqueService
服务封装了去重逻辑。getUniqueItems
方法获取唯一的项。这些方法适用于需要在Angular应用中显示唯一数据列表的场景,例如:
希望这些信息对你有所帮助!
领取专属 10元无门槛券
手把手带您无忧上云