Ag-Grid-Angular表格性能优化咨询:多行列渲染卡顿解决方案
Ag-Grid 大量行列+自定义单元格渲染卡顿的优化方案
一、自定义CellRender 针对性优化
- 别全局套用自定义渲染,用
cellRendererSelector按需配置:只给真正需要自定义展示的列设置cellRender,其他列用默认渲染逻辑,减少不必要的组件创建开销 - 给自定义渲染组件“减负”:
- 复杂计算、数据转换提前在数据预处理阶段完成,别丢给渲染函数实时处理
- 利用框架的纯组件优化(比如React.memo、Vue的组件memo化),避免组件无意义的重复渲染
- 避免在渲染函数中临时创建新对象/数组,比如样式对象提前缓存好,别每次渲染都写
style={{color: '#333'}}这种动态生成的内容
- 能用
valueFormatter就别用cellRender:如果只是做文本格式化处理,valueFormatter的性能远高于cellRender,不需要额外创建DOM元素 - 优先使用框架原生的
cellRendererFramework:比如直接用React/Vue组件作为渲染器,框架自带的优化机制能有效减少冗余渲染
二、数据与渲染策略优化
- 确保虚拟滚动生效:Ag-Grid默认开启虚拟滚动,但要确认
rowModelType为clientSide时的配置正确;超大数据量直接切换为infinite行模型,只渲染当前可视区域的行 - 采用分页加载:数据量极大时,不要一次性加载所有数据,改用分页模式,每次只加载当前页的内容,直接减少DOM渲染数量
- 保留列虚拟化:
columnVirtualisation默认开启,它会只渲染可视区域的列,横向滚动时再动态加载其他列,降低横向DOM的渲染压力 - 提前预处理数据:将JSON数据转换为表格所需的格式,过滤掉不需要展示的字段,减少表格需要处理的数据量
三、表格配置“瘦身”优化
- 关闭非必需特性:
- 不需要排序就关闭
enableSorting,不需要筛选就关闭enableFilter - 关掉
animateRows、enableCellChangeFlash、enableRangeSelection这类非核心交互特性,动画和额外事件监听都是性能消耗点
- 不需要排序就关闭
- 固定行高:设置
rowHeight为固定值,避免Ag-Grid动态计算行高,减少布局计算的时间开销 - 不需要行点击选中就开启
suppressRowClickSelection:减少不必要的事件监听,节省资源 - 超大数据量切换为
serverSide行模型:让后端负责分页和数据加载,客户端只处理当前页的内容,大幅降低前端压力
四、其他细节优化
- 批量更新数据:避免单条数据频繁修改,尽量用
api.setRowData()做批量更新,同时尽量复用原有数据结构,减少Ag-Grid的diff计算量 - 精简自定义渲染的DOM结构:避免嵌套过多层级的元素,DOM节点越多,浏览器重排重绘的成本越高
- 适当调大
rowBuffer缓存:默认值为20,适当调大可以缓存可视区域上下的行,滚动时减少组件创建和销毁的频次 - 缓存列配置:比如React中将列定义用
useMemo缓存,或者放到组件外部,别每次组件渲染都重新生成列配置,避免无用的重复计算
内容的提问来源于stack exchange,提问作者怕疼的猫
相关产品推荐
相关产品推荐

