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

AgGrid单元格渲染按钮点击时useState变量(userGroupData)为空问题

问题原因及解决方案

核心问题:闭包捕获了旧值

你的groupColumnDefs通过useState初始化时,userGroupData还是空数组。cellRenderer里的onClick回调形成闭包,捕获了此时的userGroupData引用。后续userGroupData更新时,groupColumnDefs并未重新生成,导致点击按钮时deleteRow仍使用最初的空数组值。

解决方案

方案1:让列定义依赖最新数据

用useMemo定义groupColumnDefs,将userGroupData设为依赖,确保数据更新时列定义重新生成,闭包捕获最新值:

const groupColumnDefs = useMemo(() => [
    {
      field: "groupName",
      flex: 4,
    },
    {
      field: "Delete",
      flex: 1,
      cellRenderer: (params: any) => {
        return (
          <Button
            className="p-2 w-16 my-1 flex justify-center"
            onClick={() => deleteRow(params)}
            color="red"
          >
            Delete
          </Button>
        );
      },
    },
  ], [userGroupData]);

方案2:用Ref保存最新数据

通过useRef存储userGroupData的最新引用,避免闭包捕获旧值:

const userGroupDataRef = useRef(userGroupData);

useEffect(() => {
  userGroupDataRef.current = userGroupData;
}, [userGroupData]);

const deleteRow = (params: any) => {
    console.log(params);
    console.log(userGroupDataRef.current); // 始终获取最新数据
};

方案3:让删除函数依赖最新数据

用useCallback包裹deleteRow,将userGroupData设为依赖,确保函数每次数据更新时重新创建:

const deleteRow = useCallback((params: any) => {
    console.log(params);
    console.log(userGroupData);
}, [userGroupData]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:53:27