React中AG Grid无限滚动与数据虚拟化实现能力问询
AgGrid无限滚动与虚拟化实现方案
AgGrid原生支持无限滚动和行虚拟化,完全能满足你提出的需求,以下是具体实现方式:
1. 滚动至底部自动调用API加载数据
开启AgGrid的无限滚动模式后,组件会自动监听滚动位置,当需要新数据时触发API请求,无需手动处理滚动监听。核心配置如下:
- 设置
rowModelType="infinite":启用无限行模型 - 配置
datasource对象:其中的getRows方法会在AgGrid需要新数据时被调用,你只需在该方法内发起API请求,返回对应范围的数据即可。
React中的代码示例:
import { AgGridReact, useGridRef } from 'ag-grid-react'; import 'ag-grid-community/styles/ag-grid.css'; import 'ag-grid-community/styles/ag-theme-alpine.css'; const InfiniteScrollGrid = () => { const gridRef = useGridRef(); // 定义数据源 const infiniteDatasource = { getRows: async (params) => { try { // 根据AgGrid传入的行范围请求数据 const response = await fetch(`/api/your-data?start=${params.startRow}&end=${params.endRow}`); const result = await response.json(); // 将获取到的数据返回给AgGrid,同时传入总数据量 params.successCallback(result.rows, result.totalCount); } catch (error) { params.failCallback(); } } }; const columnDefs = [ { field: 'id', headerName: 'ID' }, { field: 'name', headerName: '名称' }, { field: 'amount', headerName: '数值' } ]; return ( <div className="ag-theme-alpine" style={{ height: '600px', width: '100%' }}> <AgGridReact rowModelType="infinite" datasource={infiniteDatasource} columnDefs={columnDefs} // 每次加载20条数据,控制预加载的块大小 cacheBlockSize={20} // 限制内存中缓存的数据块数量,避免内存占用过高 maxBlocksInCache={5} /> </div> ); }; export default InfiniteScrollGrid;
2. 虚拟化预加载与持续API调用
AgGrid的虚拟化是内置功能,默认只会渲染当前视口内的行,同时会预加载cacheBlockSize指定的下一块数据(比如设置为20,就会提前加载下20条),实现无延迟渲染。
cacheBlockSize:控制每次从API获取的行数,也就是预加载的数量,可设置为10-20满足你的需求- 无限滚动模式下,
getRows方法会在滚动到需要新数据块时自动触发,持续调用API获取数据,无需额外编写循环或监听逻辑
额外说明
如果不使用原生无限滚动,想手动实现滚动到底部追加数据,也可以通过onBodyScroll事件监听滚动位置,判断是否到达底部后调用API,再用gridRef.current.api.updateRowData({ add: newRows })追加数据,但这种方式不如原生无限滚动高效,因为AgGrid会为无限行模型优化内存管理,自动清理不在缓存范围内的行,避免内存溢出。
内容的提问来源于stack exchange,提问作者Ramki
相关产品推荐
相关产品推荐

