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

点击按钮后无法刷新AG Grid数据的问题求助

问题分析

你遇到的核心问题是:AG Grid编辑单元格时会直接修改rowData数组内的对象引用,而React Query返回的data与当前rowData指向的是同一批对象。调用setRowData(data)时,由于引用未发生变化,React不会触发组件重渲染,AG Grid也无法感知到数据需要重置。

解决方案

方法1:传递原始数据的深拷贝

通过深拷贝创建新的数据引用,强制React和AG Grid识别到数据变化:

useEffect(() => {
    // 初始化时深拷贝原始数据
    setRowData(data ? JSON.parse(JSON.stringify(data)) : []);
}, [data]);

const cancelChangesClicked = useCallback(() => {
    // 取消时同样传入深拷贝后的原始数据
    setRowData(JSON.parse(JSON.stringify(data)));
}, [data]);

方法2:使用AG Grid API直接刷新

利用网格内置API完成数据重置,同时同步本地状态:

const cancelChangesClicked = useCallback(() => {
    if (gridRef.current) {
        // 深拷贝后通过API更新网格数据
        gridRef.current.api.setRowData(JSON.parse(JSON.stringify(data)));
        // 同步更新本地state
        setRowData(JSON.parse(JSON.stringify(data)));
    }
}, [data]);

方法3:维护纯净的原始数据副本(推荐)

提前保存原始数据的深拷贝副本,取消时直接替换为副本:

import { useMemo } from "react";

function App() {    
    const { data, status } = useQuery('members', getMemberList);
    const gridRef = useRef();
    // 保存原始数据的纯净深拷贝
    const originalData = useMemo(() => data ? JSON.parse(JSON.stringify(data)) : [], [data]);
    const [rowData, setRowData] = useState([]);

    useEffect(() => {
        setRowData(originalData);
    }, [originalData]);

    const cancelChangesClicked = useCallback(() => {
        setRowData(originalData);
    }, [originalData]);

    // 其余代码保持不变...
}
关键原理

AG Grid与React的更新机制均依赖引用变化检测数据更新。当直接修改数组内的对象时,数组本身的引用未改变,因此即使调用setRowData传入同一引用,两者都不会触发更新逻辑。通过深拷贝生成新引用,就能让它们识别到数据已变更,完成重置操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:07:43