
AG Grid 的服务器端行模型(SSRM)支持树形数据的无限滚动,关键在于 getRows 成功回调中正确设置 rowCount 参数——它必须是当前节点(含子节点)的总行数,而非本次返回的子集数量。
ag grid 的服务器端行模型(ssrm)支持树形数据的无限滚动,关键在于 `getrows` 成功回调中正确设置 `rowcount` 参数——它必须是当前节点(含子节点)的总行数,而非本次返回的子集数量。
在使用 AG Grid React 构建海量树形数据(如百万级节点)时,仅靠 treeData: true 和 rowModelType: 'serverSide' 并不足以自动启用无限滚动。真正的控制权掌握在 Server-Side Datasource 的 getRows 回调逻辑中,尤其是对 success({ rowData, rowCount }) 的调用方式。
核心原理:rowCount 决定是否触发后续加载
AG Grid 会根据 rowCount 值判断当前节点是否“有更多数据可加载”:
- 若
rowCount > rowData.length→ Grid 认为该层级存在未加载行,当用户滚动到底部时将自动发起下一批getRows请求(保持groupKeys不变,仅更新startRow/endRow); - 若
rowCount === rowData.length→ Grid 视为该层级数据已全部加载完毕,不再触发后续请求; - 若
rowCount === -1→ 启用“未知总数”模式(需手动调用onCacheUpdated()),但不推荐用于树形无限滚动,因其无法精准支持子节点分页。
正确实现示例(React + TypeScript)
const createServerSideDatasource = (): IServerSideDatasource => ({
getRows: (params: IServerSideGetRowsParams) => {
const { startRow, endRow, groupKeys, filterModel, sortModel } = params;
// 1. 构造服务端查询参数(含分页、过滤、排序)
const apiParams = {
start: startRow,
limit: endRow - startRow,
parentKey: groupKeys.length > 0 ? groupKeys[groupKeys.length - 1] : null,
filter: filterModel,
sort: sortModel,
};
// 2. 调用后端 API 获取当前页数据(注意:只返回 [startRow, endRow) 区间的数据)
fetch('/api/tree-data', { method: 'POST', body: JSON.stringify(apiParams) })
.then(res => res.json())
.then((response: { data: any[]; totalCount: number }) => {
const { data: rowData, totalCount: rowCount } = response;
// ✅ 关键:rowCount 必须是当前 groupKeys 路径下所有子节点的总数
// 例如:groupKeys = ['A'] → rowCount = A 节点下全部子项数量(可能为 500,000)
// 即使本次只返回了前 100 条(rowData.length === 100),rowCount 仍应为 500000
params.success({ rowData, rowCount });
})
.catch(error => {
console.error('Failed to load tree data:', error);
params.fail();
});
},
});
注意事项与最佳实践
-
服务端必须支持按
groupKeys分层统计总数:每个getRows请求都携带groupKeys(如['region-1', 'dept-5']),后端需据此精确计算该子树的总节点数,不能仅返回全局总数。 -
groupKeys是路径标识,非 ID 列表:其顺序代表展开层级,[]表示根层,['id1']表示第一级子节点,['id1', 'id2']表示二级子节点——后端需据此定位对应子树。 -
避免在前端缓存
rowCount:每次getRows请求都应动态查询真实总数,防止因数据变更导致滚动异常(如新增/删除节点后未刷新缓存)。 -
配合
isServerSideGroupOpenByDefault提升体验:对高频展开节点可预设open: true,减少首次点击延迟。 - 性能兜底建议:对极深嵌套(>10 层)或超宽分支(单节点子节点 > 10w),考虑在服务端增加层级深度限制或引入虚拟化折叠策略。
通过严格遵循 rowCount 语义并确保服务端分层统计能力,即可在 AG Grid 中稳定实现任意层级的树形数据无限滚动——真正让百万级树结构既可交互,又零卡顿。










