如何优化Kendo Grid数据更新性能?切换4000-6000行子集卡顿5秒
Kendo Grid大数据量筛选卡顿的优化方案
你当前的实现每次切换日期筛选范围会出现5秒停顿,本质是几个完全可避免的性能开销叠加导致的,并不是Kendo Grid本身没有能力承载几千甚至上万行的数据。
现有实现的核心性能瓶颈
- 最大的卡顿来源:每次更新数据后调用
grid.setOptions()全量重定义列配置,这个操作会触发Grid整个DOM结构的卸载与重建,哪怕是只有7列的简单Grid,全量重绘的开销也远大于数据本身的渲染开销,是造成长时停顿的核心诱因 - 对格式重置的认知偏差:你观察到“加载新数据后日期格式失效”,并不是
dataSource.data(newData)方法本身会破坏列配置,是你之前的日期格式绑定没有固化在Grid初始化的列定义里,才需要每次换数据后手动重设列规则 - 无意义的全量DOM挂载:当前实现没有启用Kendo Grid自带的虚拟滚动能力,默认配置下Grid会把所有4000-6000行的DOM节点一次性全部渲染到页面上,累计的DOM节点数会达到数万个,进一步放大操作时的卡顿感
可落地的高效数据更新实现
完全可以在不修改原有业务逻辑的前提下,把筛选切换的延迟从5秒降到百毫秒以内,实现上万行数据的流畅承载:
- 从根源上取消列重设操作:在Grid初始化阶段就把日期格式等列规则固定写在列配置里,比如日期列直接在初始化代码中声明:
{ field: "date", title: "日期", format: "{0:yyyy-MM-dd}", width: 120 }
列配置一旦固定,不管后续怎么替换数据源里的子集数据,格式永远不会被重置,彻底不需要再调用setOptions()重设列 - 数据替换简化为核心数据源操作:删掉重设列的全部冗余代码,更新数据只需要执行核心逻辑即可:
这个操作仅会更新数据源的绑定内容,不会触发Grid结构重绘,性能损耗可以忽略grid = $("#grid").data("kendoGrid"); grid.dataSource.data(newData); - 开启虚拟滚动支撑万级数据量:在Grid初始化配置中加上虚拟滚动参数,无需修改现有筛选逻辑:
开启后Grid只会渲染当前可视区域内的十几行DOM,哪怕总数据量达到2万行,实际挂载的DOM节点数始终维持在几十的量级,完全不会出现卡顿scrollable: { virtual: true }, pageable: { pageSize: 50 } - 减少筛选时的重复计算:在初始化加载全量数据时,就提前把每一行的日期值、格式转换结果做缓存,后续用户切换日期范围时,只需要从全量缓存数据中按区间切片取子集,不需要重复做日期解析、格式转换的计算,进一步压缩筛选响应时间
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

