You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:12:26