当前位置: 首页 > news >正文

Angular 由一个bug说起之一:List / Grid的性能问题

在angular中,MatTable构建简单,使用范围广。但某些时候会出现卡顿

卡顿情景:

1一次性请求太多的数据

2一次性渲染太多数据,这会花费CPU很多时间

3行内嵌套复杂的元素

4使用过多的ngStyle或者ngClass。或者一些额外的class

        import { MatTableDataSource } from '@angular/material/table';    
...const data: IDemoRow[] = [];for (let i = 0; i < 8000; i++) {data.push({studentId: `studentId-${i + 1}`,name: `name-${i}`,className: `className-${i}`,age: i,address: `address-${i}`,studySubjects: ['studySubjects-1','studySubjects-2','studySubjects-3','studySubjects-4','studySubjects-5','studySubjects-6',],grade: 4});}this.dataSource = new MatTableDataSource(data);

第一次渲染会卡顿,拖动滚动条时会出现空白现象。

提升办法:

1分页

使用MatPaginator对数据进行分页

    import { MatPaginator } from '@angular/material/paginator';
...@ViewChild(MatPaginator) paginator: MatPaginator;
...ngAfterViewInit() {this.dataSource.paginator = this.paginator;}
<table mat-table [dataSource]="dataSource">...
</table>
<mat-paginator[pageSizeOptions]="[13, 50, 200]"showFirstLastButtons>
</mat-paginator>

效果如下:

2:尽可能少用或不用ngStyle和 ngClass。无效的css及时清理。ngStyle不仅导致性能问题。还会使样式无法被覆盖。因此要慎用

// less
.grade-background {background: #a1bcd6;
}
.grade-color {color: #37474f;
}// html
<table mat-table [dataSource]="dataSource">...<ng-container matColumnDef="grade"><th mat-header-cell *matHeaderCellDef class="class-unnecessary"> Grade </th><td mat-cell *matCellDef="let element"class="table-cell grade-color class-unnecessary-test"[ngClass]="{'grade-background' : element.grade === 3}"[ngStyle]="{'color': '#DB5C5C'}">{{element.grade}}</td></ng-container>...
</table>

第一次渲染会卡顿,且ngStyle的值未被覆盖

3:使用trackBy,trackBy是angular提供的函数,来告诉angular怎么跟踪数组里的项目。这会减少不必要的DOM的删除和重建

trackByFunction(index: number, row: IDemoRow): string {return row.studentId;
}<table mat-table [dataSource]="dataSource"[trackBy]="trackByFunction">...
</table>
<mat-paginator[pageSizeOptions]="[13, 50, 200]"showFirstLastButtons>
</mat-paginator>

4:但是对于更复杂的表的使用,比如分组管理数据。打开或者关闭某个组的时候,还要操作DOM,那么在以上几种方法的基础上可能还会卡顿

这时候需要利用interval分批操作DOM,能减少卡顿问题

intervalH = window.setInterval(() => {...if (...) {window.clearInterval(intervalH);intervalH = undefined;}...
}, interval);

以上就是几种常用的优化方法。

http://www.lryc.cn/news/225759.html

相关文章:

  • 第12章 PyTorch图像分割代码框架-3:推理与部署
  • MYSQL---基础篇
  • 【启扬方案】启扬安卓屏一体机在医疗自助服务终端上的应用解决方案
  • 收藏!7个国内「小众」的程序员社区
  • LeetCode(4)删除有序数组中的重复项 II【数组/字符串】【中等】
  • C++ 同构字符串/ 单词规律
  • oracle 中 %TYPE %ROWTYPE
  • Pytorch实战教程(五)-计算机视觉基础
  • 51单片机PCF8591数字电压表数码管显示设计( proteus仿真+程序+设计报告+讲解视频)
  • 普华永道于进博会首发“企业数据资源会计处理一体化平台”
  • IDEA 使用Reset Current Branch to Here 进行git 版本控制,图文操作
  • 有趣的 TCP 抢带宽行为
  • HCIP---VRRP
  • 在家用Python搞副业,也能月入10000+
  • play() failed because the user didn‘t interact with the document first.
  • Java任意视频转MP4
  • flutter实践:慎用Expanded
  • 华为防火墙vrrp+hrp双机热备负载分担(两端为交换机)
  • 欧拉角(横滚角、俯仰角、偏航角)、旋转矩阵、四元数的转换与解决万向节死锁
  • Java Post请求参数格式为XML
  • Windows 安装 JDK 8 和 JDK 17 和多版本JDK切换
  • SpringData、SparkStreaming和Flink集成Elasticsearch
  • 中国电子学会2023年09月份青少年软件编程Python等级考试试卷六级真题(含答案)
  • 基于STM32设计的智能水母投喂器(华为云IOT)
  • 合成数据加速机器视觉学习
  • 物业管理服务预约小程序的效果如何
  • ORA-00257: Archiver error. Connect AS SYSDBA only until resolved错误解决
  • backbone:从AlexNet到...(持续补充ing)
  • FiRa标准——MAC实现(二)
  • oracle中分组函数LISTAGG