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

AG Grid服务端模型集成Redux Toolkit Query时外部参数更新问题

AG Grid服务端模型与RTK Query集成:外部参数更新后getRows获取最新值的解决方法

尝试将AG Grid服务端模型与Redux Toolkit Query集成时,遇到外部参数(param1/param2)更新后,getRows方法无法获取最新值的问题。当前已启用分页、筛选和排序功能,担心直接覆盖数据源会丢失这些配置。示例代码如下:

function MyGrid({ param1, param2 }: props): ReactElement {
    // param1/param2会在此处更新
    const [triggerPostData] = usePostDataMutation();

    const createDatasource: () => IServerSideDatasource = useCallback(() => {
        return {
            getRows: (parameters): void => {
                // 此处无法获取更新后的param1/param2
                triggerPostData({ param1, param2, rowsRequestData: parameters.request })
                    .unwrap()
                    .then((data) => {
                        parameters.success({
                            rowData: data.results,
                            rowCount: data.resultCount
                        });
                        return parameters;
                    })
                    .catch(() => {
                        parameters.fail();
                    });
            }
        };
    }, [param1, param2, triggerPostData]);

    const onGridReady = useCallback(
        (parameters: GridReadyEvent): void => {
            parameters.api.setServerSideDatasource(createDatasource());
        },
        [createDatasource]
    );

    const agGridProperties: AgGridReactProps = {
        columnDefs,
        rowModelType: 'serverSide',
        cacheBlockSize: paginationPageSize,
        onGridReady
    };

    return <AgGridReact {...agGridProperties} />;
}

核心问题

AG Grid的服务端数据源实例一旦通过setServerSideDatasource设置后,其内部的getRows函数会捕获创建时的闭包变量。当外部param1/param2更新时,旧的数据源实例依然持有旧的参数值,而直接重新设置数据源会清除AG Grid已缓存的分页、筛选和排序状态。

解决方法

方法一:用React Ref保存最新参数,避免频繁重建数据源

通过React的useRef实时更新并存储最新的param值,让getRows直接访问ref.current获取最新参数,无需每次参数变化都重建数据源,也不会丢失现有配置。

修改后的代码:

function MyGrid({ param1, param2 }: props): ReactElement {
    const [triggerPostData] = usePostDataMutation();
    // 用ref保存最新的参数值
    const paramsRef = useRef({ param1, param2 });

    // 监听参数变化,更新ref
    useEffect(() => {
        paramsRef.current = { param1, param2 };
    }, [param1, param2]);

    const createDatasource: () => IServerSideDatasource = useCallback(() => {
        return {
            getRows: (parameters): void => {
                // 从ref中获取最新的参数
                const { param1, param2 } = paramsRef.current;
                triggerPostData({ param1, param2, rowsRequestData: parameters.request })
                    .unwrap()
                    .then((data) => {
                        parameters.success({
                            rowData: data.results,
                            rowCount: data.resultCount
                        });
                    })
                    .catch(() => {
                        parameters.fail();
                    });
            }
        };
    }, [triggerPostData]); // 不再依赖param1/param2

    const onGridReady = useCallback(
        (parameters: GridReadyEvent): void => {
            parameters.api.setServerSideDatasource(createDatasource());
        },
        [createDatasource]
    );

    const agGridProperties: AgGridReactProps = {
        columnDefs,
        rowModelType: 'serverSide',
        cacheBlockSize: paginationPageSize,
        onGridReady
    };

    return <AgGridReact {...agGridProperties} />;
}

方法二:参数更新时刷新AG Grid缓存(保留现有配置)

如果需要在参数变化时触发数据刷新,可以调用AG Grid的refreshServerSideStore方法,该方法会保留当前的分页、筛选和排序状态,同时重新触发getRows请求,结合方法一的ref就能拿到最新参数。

添加参数变化时的刷新逻辑:

function MyGrid({ param1, param2 }: props): ReactElement {
    const [triggerPostData] = usePostDataMutation();
    const paramsRef = useRef({ param1, param2 });
    const gridApiRef = useRef<GridApi | null>(null); // 保存grid实例

    useEffect(() => {
        paramsRef.current = { param1, param2 };
        // 参数变化时,刷新服务端存储,保留现有分页筛选状态
        if (gridApiRef.current) {
            gridApiRef.current.refreshServerSideStore({ purge: false });
        }
    }, [param1, param2]);

    const createDatasource: () => IServerSideDatasource = useCallback(() => {
        return {
            getRows: (parameters): void => {
                const { param1, param2 } = paramsRef.current;
                triggerPostData({ param1, param2, rowsRequestData: parameters.request })
                    .unwrap()
                    .then((data) => {
                        parameters.success({
                            rowData: data.results,
                            rowCount: data.resultCount
                        });
                    })
                    .catch(() => {
                        parameters.fail();
                    });
            }
        };
    }, [triggerPostData]);

    const onGridReady = useCallback(
        (parameters: GridReadyEvent): void => {
            gridApiRef.current = parameters.api;
            parameters.api.setServerSideDatasource(createDatasource());
        },
        [createDatasource]
    );

    const agGridProperties: AgGridReactProps = {
        columnDefs,
        rowModelType: 'serverSide',
        cacheBlockSize: paginationPageSize,
        onGridReady
    };

    return <AgGridReact {...agGridProperties} />;
}

说明

  • 方法一解决了getRows获取最新参数的问题,同时避免频繁重建数据源导致的状态丢失。
  • 方法二在参数变化时主动触发数据刷新,适合需要参数变化后立即更新表格数据的场景,purge: false确保保留现有分页、筛选和排序配置。

内容的提问来源于stack exchange,提问作者sherkal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:23:19