当前位置: 首页 > 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和HTTPS详解
  • MUYUCMS v2.1:一款开源、轻量级的内容管理系统基于Thinkphp开发
  • Activiti BPMN visualizer Using Of Idear
  • 【Android】Lombok for Android Studio 离线插件
  • Centos 64位环境下编译32位C程序
  • leetcode:141. 环形链表
  • 【大数据Hive】hive select 语法使用详解
  • MySQL中的刷脏机制详解
  • Java 并发编程面试题——Condition 接口
  • 吴恩达《机器学习》7-1->7-4:过拟合问题、代价函数、线性回归的正则化、正则化的逻辑回归模型
  • 书写Prompt的经验总结
  • Python 中使用 Selenium 隐式等待
  • Apache Airflow (四) :Airflow 调度shell命令
  • 手写链表C++
  • Hadoop学习总结(使用Java API操作HDFS)
  • [case10]使用RSQL实现端到端的动态查询
  • Babel配置的不完全指南
  • css的样式优先级
  • Elasticsearch 参考指南(升级前重新索引)
  • Electron入门介绍
  • EventListener原理
  • iOS 系统授权开发
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript 奇技淫巧
  • Vue 动态创建 component
  • vue:响应原理
  • 复杂数据处理
  • 前端js -- this指向总结。
  • 前端工程化(Gulp、Webpack)-webpack
  • 世界上最简单的无等待算法(getAndIncrement)
  • 再次简单明了总结flex布局,一看就懂...
  • ​什么是bug?bug的源头在哪里?
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (16)Reactor的测试——响应式Spring的道法术器
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)EOS中账户、钱包和密钥的关系
  • (转)大型网站的系统架构
  • (转)重识new
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .net 调用php,php 调用.net com组件 --
  • .net6+aspose.words导出word并转pdf
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @ConfigurationProperties注解对数据的自动封装
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [Android]使用Retrofit进行网络请求