You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化加载2338条记录时卡顿的Angular Material表格

性能优化思路

一、后端(Entity Framework + 接口层)优化

  • 先排查耗时位置:用接口调试工具直接调用你的查询接口,确认卡顿是接口返回耗时高还是前端渲染耗时高,如果接口本身耗时超过3秒,优先优化后端逻辑。
  • 关闭EF非必要追踪:只读场景下查询数据时添加AsNoTracking(),不需要EF维护实体状态,可降低30%以上的查询耗时,示例代码:
var productList = _context.Productos.AsNoTracking().ToList();
  • 做字段投影查询:前端只用到idProducto、nombre、cantidad、descripcion、precio五个字段,不要全表字段查询返回,只返回需要的字段减少数据传输和查询开销:
var productList = _context.Productos
    .AsNoTracking()
    .Select(p => new {
        p.idProducto,
        p.nombre,
        p.cantidad,
        p.descripcion,
        p.precio
    })
    .ToList();
  • 开启接口响应压缩:后端开启gzip或brotli压缩,2000多条结构化数据压缩后体积可缩减到原有的1/10,大幅降低传输耗时。
  • 可选优化:如果后续数据量还会上涨,直接做服务端分页,接口接收页码、每页条数参数,每次只返回当前页的10-50条数据,接口耗时可控制在100ms以内。

二、前端(Angular + Mat Table)优化

  • 启用虚拟滚动:你现在是把2338条数据全部渲染到DOM中,节点过多是卡顿核心原因,Mat Table配合Angular CDK虚拟滚动,仅渲染可视区域的10-20条数据,不管总数据量多大渲染耗时都能控制在几百毫秒。
    首先导入ScrollingModule,再修改你的HTML代码:
<cdk-virtual-scroll-viewport itemSize="48" class="table-viewport">
  <table mat-table [dataSource]="dataSource" class="table"
  matSort matSortActive="created" matSortDisableClear matSortDirection="desc">
    <!-- 原有列定义保持不变 -->
    <tr mat-header-row *matHeaderRowDef="Columnas"></tr>
    <tr mat-row *cdkVirtualRowDef="let row; columns: Columnas"></tr>
  </table>
</cdk-virtual-scroll-viewport>

补充对应样式:

.table-viewport {
  height: 600px; /* 按你页面实际可用高度调整 */
  width: 100%;
}
  • 精简冗余逻辑:你现有代码中同时给lst和dataSource赋值全量数据,多余的内存占用也会拖慢性能,直接只用dataSource变量即可。
  • 删除调试日志:代码里的console.log(response.data)会打印大对象,额外占用运行资源,生产环境请移除。

三、快速验证顺序

优先开启前端虚拟滚动,正常情况下仅这一项优化就能解决90%的卡顿问题,如果接口返回确实慢,再叠加后端的AsNoTracking和投影查询优化,整体加载耗时可以降到1秒以内。

内容的提问来源于stack exchange,提问作者cris jar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:45:03