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

如何获取MUI X Data Grid指定单元格编辑后的更新值

解决方案

你代码里的getValue是自行声明的空函数,并非MUI Data Grid提供的官方API,自然无法获取单元格修改后的值。要正确拿到编辑值,需要通过Grid暴露的API实例调用官方方法,具体修改步骤如下:

  • 首先引入API引用钩子,初始化后绑定到DataGrid实例,再传递给自定义工具栏,即可在保存逻辑中调用取值方法。
  • 注意取值操作要放在切换单元格回视图模式之前执行,避免编辑态的临时值被框架清空。

具体代码修改

1. 导入并初始化API引用

在原有导入语句中新增useGridApiRef:

import { DataGrid, GridCellModes, useGridApiRef } from '@mui/x-data-grid';

在Donees组件内初始化API引用:

export default function Donees() {
  const [selectedCellParams, setSelectedCellParams] = React.useState(null);
  const [cellModesModel, setCellModesModel] = React.useState({});
  const apiRef = useGridApiRef(); // 新增API引用
  // 其他原有状态、逻辑保持不变

2. 传递API实例到组件树

将apiRef绑定到DataGrid组件,同时传递给自定义工具栏:

<DataGrid
  apiRef={apiRef} // 绑定API引用到DataGrid
  rows={tableData}
  columns={columns}
  getRowId={(row) => row._id}
  onCellKeyDown={handleCellKeyDown}
  cellModesModel={cellModesModel}
  components={{
    Toolbar: EditToolbar,
  }}
  componentsProps={{
    toolbar: {
      cellMode,
      selectedCellParams,
      setSelectedCellParams,
      cellModesModel,
      setCellModesModel,
      apiRef, // 传递API引用给工具栏
    },
    cell: {
      onFocus: handleCellFocus,
    },
  }}
  experimentalFeatures={{ newEditingApi: true }}
/>

3. 修改工具栏保存逻辑

修改EditToolbar组件接收apiRef参数,在保存逻辑中调用官方API取值,同步更新PropTypes校验:

function EditToolbar(props) {
  // 新增接收apiRef参数
  const { selectedCellParams, cellMode, cellModesModel, setCellModesModel, apiRef } = props;

  const handleSaveOrEdit = () => {
    if (!selectedCellParams) {
      return;
    }
    const { id, field } = selectedCellParams;
    if (cellMode === 'edit') {
      // 调用官方API获取单元格最新值,注意要在切换视图模式前执行
      const updatedValue = apiRef.current.getCellValue(id, field);
      // 如果需要获取未提交的编辑态临时值,使用下面这行替代
      // const updatedValue = apiRef.current.state.editRows[id][field].value;

      console.log('单元格更新后的值:', updatedValue);
      // 此处直接编写PUT请求逻辑即可,例如:
      // axios.put(`http://localhost:4000/donees/${id}`, { [field]: updatedValue })

      setCellModesModel({
        ...cellModesModel,
        [id]: { ...cellModesModel[id], [field]: { mode: GridCellModes.View } },
      });

    } else {
      setCellModesModel({
        ...cellModesModel,
        [id]: { ...cellModesModel[id], [field]: { mode: GridCellModes.Edit } },
      });
    }
  };

  // handleCancel、handleMouseDown和返回的JSX逻辑保持不变
}

// 更新PropTypes定义
EditToolbar.propTypes = {
  cellMode: PropTypes.oneOf(['edit', 'view']).isRequired,
  cellModesModel: PropTypes.object.isRequired,
  selectedCellParams: PropTypes.shape({
    field: PropTypes.string.isRequired,
    id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
  }),
  setCellModesModel: PropTypes.func.isRequired,
  apiRef: PropTypes.object.isRequired, // 新增apiRef校验
};

最佳实践建议

如果不需要单独控制单元格编辑的工具栏逻辑,更推荐直接使用DataGrid内置的processRowUpdate回调处理保存请求:

  • 该回调会在单元格退出编辑模式、提交修改时自动触发
  • 回调参数直接返回更新后的整行数据和原始行数据,不需要手动取值,稳定性更高
    示例代码:
<DataGrid
  // 其他原有props不变
  processRowUpdate={(updatedRow, originalRow) => {
    // 直接拿到更新后的整行数据发请求
    axios.put(`http://localhost:4000/donees/${updatedRow._id}`, updatedRow);
    return updatedRow;
  }}
  onProcessRowUpdateError={(error) => {
    console.error('数据更新失败:', error);
  }}
/>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:24:20