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

Material UI Data Grid onCellEditCommit异常行为及行数据获取问询

解决方案

问题根因

  • 你遇到的参数不一致问题是MUI Data Grid v5早期版本的已知bug,回车提交和失焦提交的事件参数未做统一对齐,失焦场景意外泄露了内部私有字段,这些私有字段没有纳入公开类型定义,也不建议依赖使用,升级到v5.17.0及以上版本可修复参数不一致的问题。
  • GridCellEditCommitParams的公开类型定义本身确实没有row字段,直接调用会触发TypeScript报错属于正常情况。

推荐实现方案(完全符合类型规范)

方案1:使用GridApiRef获取最新行数据(最简单)

这是官方推荐的标准用法,步骤如下:

  1. 先创建apiRef实例并绑定到DataGrid:
import { useGridApiRef, DataGrid } from '@mui/x-data-grid';

// 组件内
const apiRef = useGridApiRef();

return (
  <DataGrid
    apiRef={apiRef}
    // 其他原有props 比如rows、columns、editable等
    onCellEditCommit={handleCellEditCommit}
  />
)
  1. 在回调中通过id获取更新后的完整行数据:
const handleCellEditCommit = (params: GridCellEditCommitParams) => {
  // 直接拿到修改后的完整行数据,类型完全合法
  const updatedRow = apiRef.current.getRow(params.id);
  // 接下来解析updatedRow,调用PUT接口更新后端即可
};

方案2:自行维护本地rows状态(可控性更高)

如果需要额外的前置校验、回滚逻辑,可以自己维护rows状态:

const [rows, setRows] = useState<YourRowType[]>(初始行数据);

const handleCellEditCommit = (params: GridCellEditCommitParams) => {
  const { id, field, value } = params;
  // 生成修改后的行对象
  const updatedRow = rows.map(row => {
    if (row.id === id) {
      return {...row, [field]: value };
    }
    return row;
  }).find(row => row.id === id)!;
  // 调用后端PUT接口,请求成功后再更新本地rows状态
  // fetch(...).then(() => setRows(最新的rows数组))
};

注意:该方案下需要关闭DataGrid的内部状态同步,给DataGrid添加experimentalFeatures={{ preventCommitWhileEditing: true }}属性,避免内部状态和本地状态冲突。

额外说明

不要依赖非公开的私有字段,即使部分场景下可以拿到值,后续版本迭代时随时可能被移除,会导致线上功能异常。

内容的提问来源于stack exchange,提问作者Lars-Olav Vågene

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:06:00