reactjs - Material-UI 从 DataGrid 获取所有行

标签 reactjs material-ui

有谁知道如何从 Material-UI DataGrid 获取所有行数据?例如,我更改了 DataGrid 行中的一些值,并希望在进行更改后获取所有行。例子:

import { Button, TextField } from "@material-ui/core";
import { DataGrid } from "@material-ui/data-grid";
import moment from "moment";

const columns = [
  {
    field: "Col1",
    headerName: "Col1",
    flex: 1.0,
    disableClickEventBubbling: true,
    sortable: false,
    disableColumnMenu: true
  },
  {
    field: "Col2",
    headerName: "Col2",
    flex: 1.0,
    disableClickEventBubbling: true,
    sortable: false,
    disableColumnMenu: true,
    renderCell: (params) => (
      <>
        <TextField
          type="date"
          defaultValue={moment(Date.parse(params.row.Date)).format(
            "YYYY-MM-DD"
          )}
          InputLabelProps={{
            shrink: true
          }}
        />
      </>
    )
  },
  {
    field: "Col3",
    headerName: "Col3",
    flex: 1.0,
    disableClickEventBubbling: true,
    sortable: false,
    disableColumnMenu: true,
    renderCell: (params) => <TextField />
  }
];

const rows = [
  { id: 1, Col1: "col1 data", Col2: null, Col3: null },
  { id: 2, Col1: "col2 data", Col2: null, Col3: null },
  { id: 3, Col1: "col3 data", Col2: null, Col3: null }
];

export default function App() {
  const handleClickButton = () => {
    console.log(rows); //I want to see grid changed data
  };

  return (
    <div className="App">
      <DataGrid
        density="compact"
        rows={rows}
        columns={columns}
        pageSize={25}
        autoHeight={true}
        hideFooter={true}
      />
      <Button variant="contained" color="primary" onClick={handleClickButton}>
        Show me grid data
      </Button>
    </div>
  );
}
Edit 66726455/material-ui-get-all-rows-from-datagrid

最佳答案

Material-UI 的 DataGrid 内部存储了行数据,并有 its own API 来修改行数据。这是当 onChange 触发时更新行数据的方式:

{
  field: "Col3",
  headerName: "Col3",
  renderCell: (params) => (
    <TextField
      onChange={(e) =>
        params.api.updateRows([{ ...params.row, Col3: e.target.value }])
      }
    />
  )
}
要读取 DataGrid 的当前行状态,您可以使用 apiRef.current.getRowModels() 。但是 apiRef 来自 Material-UI X Pro 。如果您仍然想访问它,则必须使用以下技巧:
function useApiRef() {
  const apiRef = useRef(null);
  const _columns = useMemo(
    () =>
      columns.concat({
        field: "__HIDDEN__",
        width: 0,
        renderCell: (params) => {
          apiRef.current = params.api;
          return null;
        }
      }),
    [columns]
  );

  return { apiRef, columns: _columns };
}
用法
const { apiRef, columns } = useApiRef();
const handleClickButton = () => {
  console.log(apiRef.current.getRowModels());
};

return (
  <>
    <DataGrid rows={rows} columns={columns} />
    <Button onClick={handleClickButton}>
      Show data
    </Button>
  </>
);
现场演示
Edit 66726455/material-ui-get-all-rows-from-datagrid

关于reactjs - Material-UI 从 DataGrid 获取所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66726455/

相关文章:

reactjs - 如何为 Material UI ListItem 输入 props?

css - 在 div 中居中对齐 Paper 组件

javascript - 来自不同组件的多个 Axios GET 请求

javascript - 在 webpack 中通过 jQuery 触发事件并在页面上处理

html - 代理控制台.js :72 TypeError: Cannot read property 'default' of undefined

reactjs - 测试特定的 MaterialUI 图标

css - 单击时更改样式

javascript - 我必须单击按钮两次才能在 React 中正确渲染状态

reactjs - Rxjs 对 React 文本输入组件进行反跳

javascript - 为什么映射 React 钩子(Hook)有效,但 lambda 违反了钩子(Hook)规则?