AG Grid服务端行模型下如何禁用缓存并在切换页面时重新获取分组父行?
看起来你遇到的问题我之前也帮人排查过——AG Grid的服务端行模型对根级分组父行的缓存逻辑确实和子行不一样,默认会把这些父行缓存起来,导致切换页面时只会重新请求子行,父行还在复用旧数据。我来给你一步步拆解解决思路和具体做法:
核心问题点
AG Grid默认认为**顶级分组节点(比如你说的"United States"、"China"这类父行)**是全局数据集的一部分,不会随分页切换自动清除缓存。但你的需求是每次切页都要从服务器拉取当前页的父行,所以必须主动干预缓存的清除逻辑。
具体解决步骤
1. 先收紧Grid的缓存配置
先把你的现有配置再优化下,把缓存的空间压缩到极致,避免残留:
rowModelType={'serverSide'} pagination={true} paginationPageSize={2} cacheBlockSize={2} maxBlocksInCache={1} cacheOverflowSize={0} // 新增:彻底禁止缓存超出当前块的内容 serverSideStoreType="partial" // 只保留当前展开的节点数据
cacheOverflowSize={0}会让Grid完全不保留超出当前缓存块的任何数据,serverSideStoreType="partial"则会进一步限制只存储当前展开的节点,从配置层面减少缓存的可能。
2. 监听分页切换,主动清除所有缓存
这是解决父行不重新请求的关键!你需要在分页切换时,主动调用Grid的API清除所有服务端缓存,强制触发根级父行的重新请求。
在Grid组件中添加onPaginationChanged事件监听:
onPaginationChanged={(params) => { // 跳过组件初始化时的默认分页事件 if (!params.api || params.api.getDisplayedRowCount() === 0) return; // 清除所有服务端行模型的缓存,包括根级分组父行 params.api.purgeServerSideCache(); // 强制刷新根级数据存储,触发父行的重新请求 params.api.refreshServerSideStore({ purge: true, // 确保彻底清除缓存 route: [] // 空数组代表操作根级节点,也就是分组父行 }); }}
这里的purgeServerSideCache()会把所有服务端缓存清干净,包括之前的父行数据;refreshServerSideStore则会主动触发根级节点的getRows请求,让服务器返回当前页的分组父行。
3. 服务端getRows接口要配合处理分页
最后,你的服务端getRows方法要能正确识别请求类型:
- 当
params.request.groupKeys是空数组时,说明是请求根级分组父行,要返回当前页的父行数据(比如第1页返回前2个国家,第2页返回接下来的2个) - 当
params.request.groupKeys有值(比如["United States"]),说明是请求某个分组的子行,再返回对应的数据
这样一来,每次切换页面时,Grid会先拉取当前页的分组父行,等你展开某个父行时,再按需拉取对应的子行,完全符合你“无缓存、切页就重新拉父行”的需求。
验证效果
配置完后你可以测试下:
- 切换页面时,看网络请求会触发根级的
getRows请求,返回当前页的父分组 - 展开父分组时,才会触发对应子行的请求
- 所有数据都是实时从服务器拉的,没有缓存残留
内容来源于stack exchange

