我是 MUI 的新手并做出反应,试图配置一个带有编辑和删除操作按钮的行可编辑 DataGrid。我从 MUI 网站复制了以下代码,并将 DataGridPro 更改为 DataGrid,因为在我看来,所有行编辑功能在 DataGrid 版本中也可用。我的理解可能有误,请帮助。下面的代码显示了编辑和删除按钮,但是点击该行并没有更改为编辑模式,尽管显示了取消和保存按钮。在将版本更改回 DataGridPro 后,一切都开始按预期工作。
谢谢, 杰姆
import * as React from "react";
import PropTypes from "prop-types";
import Box from "@mui/material/Box";
import Button from "@mui/material/Button";
import AddIcon from "@mui/icons-material/Add";
import EditIcon from "@mui/icons-material/Edit";
import DeleteIcon from "@mui/icons-material/DeleteOutlined";
import SaveIcon from "@mui/icons-material/Save";
import CancelIcon from "@mui/icons-material/Close";
import {
GridRowModes,
DataGrid,
GridToolbarContainer,
GridActionsCellItem,
} from "@mui/x-data-grid";
import {
randomCreatedDate,
randomTraderName,
randomUpdatedDate,
randomId,
} from "@mui/x-data-grid-generator";
const initialRows = [
{
id: randomId(),
name: randomTraderName(),
age: 25,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: randomId(),
name: randomTraderName(),
age: 36,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: randomId(),
name: randomTraderName(),
age: 19,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: randomId(),
name: randomTraderName(),
age: 28,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: randomId(),
name: randomTraderName(),
age: 23,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
];
function EditToolbar(props) {
const { setRows, setRowModesModel } = props;
const handleClick = () => {
const id = randomId();
setRows((oldRows) => [...oldRows, { id, name: "", age: "", isNew: true }]);
setRowModesModel((oldModel) => ({
...oldModel,
[id]: { mode: GridRowModes.Edit, fieldToFocus: "name" },
}));
};
return (
<GridToolbarContainer>
<Button color="primary" startIcon={<AddIcon />} onClick={handleClick}>
Add record
</Button>
</GridToolbarContainer>
);
}
EditToolbar.propTypes = {
setRowModesModel: PropTypes.func.isRequired,
setRows: PropTypes.func.isRequired,
};
export default function FullFeaturedCrudGrid() {
const [rows, setRows] = React.useState(initialRows);
const [rowModesModel, setRowModesModel] = React.useState({});
const handleRowEditStart = (params, event) => {
event.defaultMuiPrevented = true;
};
const handleRowEditStop = (params, event) => {
event.defaultMuiPrevented = true;
};
const handleEditClick = (id) => () => {
setRowModesModel({ ...rowModesModel, [id]: { mode: GridRowModes.Edit } });
};
const handleSaveClick = (id) => () => {
setRowModesModel({ ...rowModesModel, [id]: { mode: GridRowModes.View } });
};
const handleDeleteClick = (id) => () => {
setRows(rows.filter((row) => row.id !== id));
};
const handleCancelClick = (id) => () => {
setRowModesModel({
...rowModesModel,
[id]: { mode: GridRowModes.View, ignoreModifications: true },
});
const editedRow = rows.find((row) => row.id === id);
if (editedRow.isNew) {
setRows(rows.filter((row) => row.id !== id));
}
};
const processRowUpdate = (newRow) => {
const updatedRow = { ...newRow, isNew: false };
setRows(rows.map((row) => (row.id === newRow.id ? updatedRow : row)));
return updatedRow;
};
const handleRowModesModelChange = (newRowModesModel) => {
setRowModesModel(newRowModesModel);
};
const columns = [
{ field: "name", headerName: "Name", width: 180, editable: true },
{ field: "age", headerName: "Age", type: "number", editable: true },
{
field: "dateCreated",
headerName: "Date Created",
type: "date",
width: 180,
editable: true,
},
{
field: "lastLogin",
headerName: "Last Login",
type: "dateTime",
width: 220,
editable: true,
},
{
field: "actions",
type: "actions",
headerName: "Actions",
width: 100,
cellClassName: "actions",
getActions: ({ id }) => {
const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit;
if (isInEditMode) {
return [
<GridActionsCellItem
icon={<SaveIcon />}
label="Save"
onClick={handleSaveClick(id)}
/>,
<GridActionsCellItem
icon={<CancelIcon />}
label="Cancel"
className="textPrimary"
onClick={handleCancelClick(id)}
color="inherit"
/>,
];
}
return [
<GridActionsCellItem
icon={<EditIcon />}
label="Edit"
className="textPrimary"
onClick={handleEditClick(id)}
color="inherit"
/>,
<GridActionsCellItem
icon={<DeleteIcon />}
label="Delete"
onClick={handleDeleteClick(id)}
color="inherit"
/>,
];
},
},
];
return (
<Box
sx={{
height: 500,
width: "100%",
"& .actions": {
color: "text.secondary",
},
"& .textPrimary": {
color: "text.primary",
},
}}
>
<DataGrid
rows={rows}
columns={columns}
editMode="row"
rowModesModel={rowModesModel}
onRowModesModelChange={handleRowModesModelChange}
onRowEditStart={handleRowEditStart}
onRowEditStop={handleRowEditStop}
processRowUpdate={processRowUpdate}
slots={{
toolbar: EditToolbar,
}}
slotProps={{
toolbar: { setRows, setRowModesModel },
}}
/>
</Box>
);
}
我试图使从 MUI 网站复制的代码适用于 DataGrid,将版本从专业版更改为基本版。我的假设是行编辑功能在这两个版本中是相同的,代码应该适用于 DataGrid。可能是我理解有误,请指导
如果您想传递参数,请不要在事件侦听器中直接调用函数....使用回调和调用函数,如 onClick-{()=>handleEdit(id)}
return [
<GridActionsCellItem
icon={<EditIcon />}
label="Edit"
className="textPrimary"
onClick={()=>handleEditClick(id)}
color="inherit"
/>,
<GridActionsCellItem
icon={<DeleteIcon />}
label="Delete"
onClick={()=>handleDeleteClick(id)}
color="inherit"
/>,
];