我无法在 MUI 的每一行中添加一个按钮DataGrid
。我有一个 MUI DataGrid
,我像这样渲染:
<DataGrid rows={rows} columns={columns} pageSize={5} checkboxSelection />
我已将按钮应位于的列变量“操作”列添加到列中。行只是我从props中获得的数据对象。如何在每一行中添加一个按钮(用于编辑该行)?我尝试映射数据数组,但不可能将 JSX 按钮添加到每个数据对象中。
我无法在 MUI 的每一行中添加一个按钮DataGrid
。我有一个 MUI DataGrid
,我像这样渲染:
<DataGrid rows={rows} columns={columns} pageSize={5} checkboxSelection />
我已将按钮应位于的列变量“操作”列添加到列中。行只是我从props中获得的数据对象。如何在每一行中添加一个按钮(用于编辑该行)?我尝试映射数据数组,但不可能将 JSX 按钮添加到每个数据对象中。
您可以通过覆盖GridColDef.renderCell
方法添加自定义组件并返回您想要的任何元素。
下面的示例显示了一个操作列,该列在每行中呈现一个按钮。单击按钮时,它会以 json 字符串的形式提醒当前行数据:
const columns: GridColDef[] = [
{ field: "id", headerName: "ID", width: 70 },
{
field: "action",
headerName: "Action",
sortable: false,
renderCell: (params) => {
const onClick = (e) => {
e.stopPropagation(); // don't select this row after clicking
const api: GridApi = params.api;
const thisRow: Record<string, GridCellValue> = {};
api
.getAllColumns()
.filter((c) => c.field !== "__check__" && !!c)
.forEach(
(c) => (thisRow[c.field] = params.getValue(params.id, c.field))
);
return alert(JSON.stringify(thisRow, null, 4));
};
return <Button onClick={onClick}>Click</Button>;
}
},
];
刚好碰到这个。
您需要做的是在列数组中包含一个 renderCell 方法。
const columns = [
{
field: 'col1',
headerName: 'Name 1',
width: 150,
disableClickEventBubbling: true,
},
{
field: 'col2',
headerName: 'Name 2',
width: 300,
disableClickEventBubbling: true,
},
{
field: 'col3',
headerName: 'Name 3',
width: 300,
disableClickEventBubbling: true,
},
{
field: 'col4',
headerName: 'Name 4',
width: 100,
disableClickEventBubbling: true,
},
{
field: 'col5',
headerName: 'Name 5',
width: 150,
***renderCell: renderSummaryDownloadButton,***
disableClickEventBubbling: true,
},
{
field: 'col6',
headerName: 'Name 6',
width: 150,
***renderCell: renderDetailsButton,***
disableClickEventBubbling: true,
},
]
在上面,我在第 5 列和第 6 列内呈现一个 Button,它将出现在每个填充的行上。
在此之上,您可以拥有一个从 Material-ui 创建并返回 Button 的函数。
const renderDetailsButton = (params) => {
return (
<strong>
<Button
variant="contained"
color="primary"
size="small"
style={{ marginLeft: 16 }}
onClick={() => {
parseName(params.row.col6)
}}
>
More Info
</Button>
</strong>
)
}
虽然@NearHuscarl 的回答完美地回答了这个问题,但我想发布一个 TypeScript 示例:
const onClick = () => {
const api: GridApi = params.api;
const fields = api
.getAllColumns()
.map((c) => c.field)
.filter((c) => c !== "__check__" && !!c);
const thisRow: any = {};
fields.forEach((f) => {
thisRow[f] = params.getValue(params.id, f);
});
return alert(JSON.stringify(thisRow, null, 4));
};
return <Button onClick={onClick}>Click</Button>;
另请注意,我更改了 getValue 调用。(包括行 ID)