AG Grid React:能否同时使用客户端与服务端筛选?技术咨询
嘿,我来帮你梳理AG Grid React企业版里客户端+服务端组合筛选的实现思路,还有你问的两个行模型相关问题~
客户端+服务端组合筛选实现示例
组合筛选的核心是区分筛选条件的处理层级:把轻量、简单的筛选(比如文本模糊匹配、数值范围)放在客户端处理,把复杂关联、大数据量依赖的筛选(比如跨表关联筛选、全量数据统计筛选)交给服务端。下面是一个可落地的React组件示例:
import { useState, useRef, useEffect } from 'react'; import { AgGridReact } from 'ag-grid-react'; import 'ag-grid-community/styles/ag-grid.css'; import 'ag-grid-community/styles/ag-theme-alpine.css'; import 'ag-grid-enterprise'; const CombinedFilterGrid = () => { const gridRef = useRef(null); const [rowData, setRowData] = useState([]); // 缓存全量初始数据(仅客户端筛选时用) const [fullLocalData, setFullLocalData] = useState([]); // 列定义:标记哪些列用客户端/服务端筛选 const columnDefs = [ { headerName: '姓名', field: 'name', filter: 'agTextColumnFilter', filterParams: { isClientFilter: true } }, { headerName: '部门', field: 'department', filter: 'agTextColumnFilter', filterParams: { isServerFilter: true } }, { headerName: '年龄', field: 'age', filter: 'agNumberColumnFilter', filterParams: { isClientFilter: true } }, { headerName: '职级', field: 'position', filter: 'agTextColumnFilter', filterParams: { isServerFilter: true } } ]; // 筛选变化时的核心处理逻辑 const handleFilterChanged = () => { const filterModel = gridRef.current.api.getFilterModel(); const clientFilters = {}; const serverFilters = {}; // 分离客户端/服务端筛选条件 Object.entries(filterModel).forEach(([field, filter]) => { const column = gridRef.current.api.getColumn(field); if (column?.colDef?.filterParams?.isClientFilter) { clientFilters[field] = filter; } else if (column?.colDef?.filterParams?.isServerFilter) { serverFilters[field] = filter; } }); if (Object.keys(serverFilters).length > 0) { // 有服务端筛选条件:先请求后端,再对返回数据做客户端筛选 fetch('/api/filter-employees', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(serverFilters) }) .then(res => res.json()) .then(serverData => { const finalData = applyClientFilters(serverData, clientFilters); setRowData(finalData); }); } else { // 只有客户端筛选:直接在全量本地数据上处理 const finalData = applyClientFilters(fullLocalData, clientFilters); setRowData(finalData); } }; // 客户端筛选逻辑实现(匹配AG Grid内置筛选规则) const applyClientFilters = (data, filters) => { return data.filter(row => { return Object.entries(filters).every(([field, filter]) => { const value = row[field]; if (!value) return true; // 文本筛选逻辑 if (filter.filterType === 'text') { return value.toLowerCase().includes(filter.filter.toLowerCase()); } // 数值筛选逻辑 if (filter.filterType === 'number') { switch(filter.type) { case 'equals': return value === filter.filter; case 'greaterThan': return value > filter.filter; case 'lessThan': return value < filter.filter; default: return true; } } return true; }); }); }; // 初始化加载全量数据 useEffect(() => { fetch('/api/employees') .then(res => res.json()) .then(data => { setRowData(data); setFullLocalData(data); }); }, []); return ( <div className="ag-theme-alpine" style={{ height: 600, width: '100%' }}> <AgGridReact ref={gridRef} rowData={rowData} columnDefs={columnDefs} onFilterChanged={handleFilterChanged} enableFilter={true} enterprise={true} /> </div> ); }; export default CombinedFilterGrid;
这个示例的关键逻辑是:
- 给列定义添加自定义标记区分筛选层级
- 筛选变化时分离条件,优先处理服务端请求,再对返回结果应用客户端筛选
- 纯客户端筛选时直接操作本地全量数据
关于行模型的两个疑问解答
客户端行模型是否支持调用服务的筛选功能?
完全支持!客户端行模型默认是基于本地数据处理,但你可以通过监听onFilterChanged事件,在筛选触发时手动调用服务接口,拿到筛选后的数据集再更新Grid的rowData。
举个场景:如果用户筛选了一个需要跨表关联的字段(比如“所属公司”),你就把这个筛选条件传给后端接口,后端返回匹配的员工数据后,你把数据更新到Grid即可。这个流程需要你自己实现请求和数据更新逻辑,AG Grid不会自动帮你完成,但完全支持这种扩展。
服务端行模型是否支持客户端搜索功能?
分两种情况:
- 当前分页数据的客户端搜索:完全支持。你可以直接启用AG Grid的
quickFilter功能,这时候搜索是在当前已经加载到客户端的分页数据里进行的,体验流畅。 - 全量数据的客户端搜索:不推荐也不现实。因为服务端行模型的核心是分页加载大数据,全量数据不会存在本地。这种情况更合理的做法是把搜索条件作为参数传给服务端,让后端返回匹配的结果再分页加载到Grid里——毕竟如果把全量数据拉到客户端,就失去了服务端行模型处理大数据的意义了。
内容的提问来源于stack exchange,提问作者precious
相关产品推荐
相关产品推荐

