
AG Grid 的服务器端行模型(SSRM)结合树形数据(treeData)支持真正的无限滚动,关键在于正确设置 success() 回调中的 rowCount 参数——它必须是当前节点(含子节点)的全量行数,而非本次返回的子集数量。
ag grid 的服务器端行模型(ssrm)结合树形数据(treedata)支持真正的无限滚动,关键在于正确设置 `success()` 回调中的 `rowcount` 参数——它必须是当前节点(含子节点)的**全量行数**,而非本次返回的子集数量。
在使用 AG Grid React 渲染海量层级数据(如百万级树形结构)时,仅靠 rowModelType: "serverSide" 和 treeData: true 并不足以自动启用无限滚动。核心机制依赖于你对服务器端数据源(ServerSideDatasource)中 getRows(params) 方法内 success({ rowData, rowCount }) 调用方式的精准控制。
✅ 正确实现的关键逻辑
当用户展开某个树节点(例如一个父级分组行)时,AG Grid 会再次触发 getRows 请求,并在 params.groupKeys 中携带路径信息(如 ["dept-1", "team-5"]),表示请求该子树下的数据。此时:
-
params.startRow和params.endRow指明当前视口所需的分页范围(如0–99、100–199); - 你的后端应据此返回对应区间的子节点数据(即
rowData); -
但
rowCount必须设为该子树的总行数(含所有未加载的后代) —— 这是触发后续滚动加载的唯一开关。
const getRows = (params: IServerSideGetRowsParams) => {
const { startRow, endRow, groupKeys, filterModel, sortModel } = params;
// 构造 API 请求参数(含分页与层级上下文)
const apiParams = {
start: startRow,
end: endRow,
path: groupKeys, // [] 表示根层;["A", "B"] 表示 A→B 子树
filters: filterModel,
sorts: sortModel,
};
fetch('/api/tree-data', { method: 'POST', body: JSON.stringify(apiParams) })
.then(res => res.json())
.then(({ data, totalCount }) => {
// ✅ 正确:rowCount 是整个子树的总行数(非 data.length!)
params.success({ rowData: data, rowCount: totalCount });
// ❌ 错误示例(将导致无限滚动失效):
// params.success({ rowData: data, rowCount: data.length });
})
.catch(err => params.fail());
};
⚠️ 常见陷阱与注意事项
-
rowCount必须稳定且准确:若返回值小于实际总数(如因缓存或估算偏差),Grid 将认为已到底部而停止加载;若远大于真实值,可能引发冗余请求或空白区域。 -
服务端需支持层级感知分页:查询必须能基于
groupKeys定位子树,并支持按start/end偏移量拉取任意区间子节点(而非仅首层扁平化分页)。 -
不支持“动态深度”无限滚动的简化方案:若某节点本身无子节点(叶子节点),
groupKeys长度不会增加,此时rowCount应设为0或明确标识不可展开(通过isServerSideGroup: false控制)。 -
性能提示:建议后端对
totalCount查询做轻量优化(如维护子树计数缓存),避免每次请求都执行COUNT(*)全表扫描。
? 总结
AG Grid 的 SSRM Tree Data 无限滚动并非开箱即用的功能,而是由 rowCount 的语义驱动的显式协议:只要 rowCount > endRow,Grid 就认定该层级存在更多数据,并在滚动接近底部时自动发起下一批 getRows 请求。掌握这一设计契约,即可安全支撑从根节点到任意嵌套层级的亿级数据虚拟滚动,真正实现“只渲染可视区域”的高性能树形表格体验。










