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

React TSX项目中动态控制MUI X DataGrid列的可编辑性

解决方案:基于MUI X DataGrid实现行级列编辑权限控制

核心思路是让answer列的可编辑状态依赖对应行的isRelyChatGpt勾选状态,具体修改步骤如下:

1. 修改answer列的可编辑规则

把原来固定的editable: true改为动态判断的函数,根据当前行的isRelyChatGpt值决定是否允许编辑:

{ 
  field: 'answer', 
  headerName: 'Answer', 
  width: 600, 
  // 勾选AI依赖时,answer列不可编辑;反之可编辑
  editable: (params) => !params.row.isRelyChatGpt 
},

2. 优化列配置的响应式(推荐)

因为列的编辑状态依赖行数据,用useMemo包裹列配置,确保行数据更新时列配置同步更新,避免无效重渲染:

import { useMemo } from 'react';

// ...

const qacolumns = useMemo<GridColDef[]>(() => [
  { field: 'gid', headerName: 'ID', width: 50 },
  { field: 'questionText', headerName: 'Question', width: 600, editable: true },
  { field: 'answer', headerName: 'Answer', width: 600, editable: (params) => !params.row.isRelyChatGpt },
  { field: 'isRelyChatGpt', headerName: 'Relay on AI', width: 100, renderCell: RelayOnAICell },
  { field: 'delete', headerName: 'Delete', width: 70, renderCell: DeleteCell },
], [qaRowdata]);

3. 保留原事件处理器逻辑

原handleRelayOnAIChange已经正确实现了行数据的isRelyChatGpt状态更新,状态变化后,useMemo会重新生成列配置,DataGrid会自动应用新的编辑规则。

完整修改后代码片段

import { useState, useMemo } from 'react';
import { DataGrid, GridColDef, GridRenderCellParams } from '@mui/x-data-grid';
import Checkbox from '@mui/material/Checkbox';

// ...

const [qaRowdata, setQaRowData] = useState<any[]>([]);

const qacolumns = useMemo<GridColDef[]>(() => [
  { field: 'gid', headerName: 'ID', width: 50 },
  { field: 'questionText', headerName: 'Question', width: 600, editable: true },
  { field: 'answer', headerName: 'Answer', width: 600, editable: (params) => !params.row.isRelyChatGpt },
  { field: 'isRelyChatGpt', headerName: 'Relay on AI', width: 100, renderCell: RelayOnAICell },
  { field: 'delete', headerName: 'Delete', width: 70, renderCell: DeleteCell },
], [qaRowdata]);

// ...

<DataGrid
  rows={qaRowdata}
  editMode="row"
  columns={qacolumns}
  getRowId={(row) => row.gid}
  processRowUpdate={(updatedRow, originalRow) => QARowUpdate(updatedRow, originalRow)}
/>

function RelayOnAICell(params: GridRenderCellParams) {
  return <Checkbox checked={params.row.isRelyChatGpt} onChange={(e) => handleRelayOnAIChange(e, params.row.gid)} />;
}

const handleRelayOnAIChange = (e: React.ChangeEvent<HTMLInputElement>, rowId: number) => {
  const updatedQaRowData = qaRowdata.map((row) => {
    if (row.gid === rowId) {
      return { ...row, isRelyChatGpt: e.target.checked };
    }
    return row;
  });

  setQaRowData(updatedQaRowData);
};

效果说明

勾选某行的Relay on AI复选框后,该行的Answer列会立即变为不可编辑状态;取消勾选则恢复可编辑权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:32:21