Material UI Data Grid onCellEditCommit异常行为及行数据获取问询
解决方案
问题根因
- 你遇到的参数不一致问题是MUI Data Grid v5早期版本的已知bug,回车提交和失焦提交的事件参数未做统一对齐,失焦场景意外泄露了内部私有字段,这些私有字段没有纳入公开类型定义,也不建议依赖使用,升级到v5.17.0及以上版本可修复参数不一致的问题。
GridCellEditCommitParams的公开类型定义本身确实没有row字段,直接调用会触发TypeScript报错属于正常情况。
推荐实现方案(完全符合类型规范)
方案1:使用GridApiRef获取最新行数据(最简单)
这是官方推荐的标准用法,步骤如下:
- 先创建apiRef实例并绑定到DataGrid:
import { useGridApiRef, DataGrid } from '@mui/x-data-grid'; // 组件内 const apiRef = useGridApiRef(); return ( <DataGrid apiRef={apiRef} // 其他原有props 比如rows、columns、editable等 onCellEditCommit={handleCellEditCommit} /> )
- 在回调中通过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
相关产品推荐
相关产品推荐

