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

如何在React Material UI DataGrid中获取选中行的完整数据

React MUI DataGrid 获取选中行完整数据的解决办法

问题说明

使用MUI DataGrid时,只能拿到选中行的ID,尝试访问firstName、lastName等字段时触发以下错误:

错误信息:类型'GridRowId'上不存在该属性。

这是因为你定义的selection是GridSelectionModel类型,它本质是行ID的数组,而非完整的行对象,所以直接通过data.id、data.firstName访问属性会报错。


解决方法

方法1:使用apiRef直接获取完整选中行(推荐)

MUI DataGrid提供了apiRef对象,可以直接调用API获取选中的完整行数据,这是官方推荐的方式。

代码示例:

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

// 定义行数据类型
type Row = {
  id: number;
  firstName: string;
  lastName: string;
  age: number;
};

export default function YourComponent() {
  const rows: Row[] = data; // 你的数据源
  const apiRef = useGridApiRef();
  const [selectedRows, setSelectedRows] = useState<Row[]>([]);

  const columns = [
    { field: "id", headerName: "ID", sortable: false, hide: true },
    { field: "firstName", headerName: "First Name" },
    { field: "lastName", headerName: "Last Name" },
    { field: "age", headerName: "Age" }
  ];

  return (
    <>
      <div style={{ height: 400, width: "100%" }}>
        <DataGrid
          rows={rows}
          columns={columns}
          checkboxSelection
          getRowId={(row) => row.id}
          apiRef={apiRef}
          onSelectionModelChange={() => {
            // getSelectedRows返回以ID为键的对象,转成数组
            const selected = Object.values(apiRef.current.getSelectedRows());
            setSelectedRows(selected as Row[]);
          }}
        />
      </div>

      {/* 渲染选中行的完整数据 */}
      <div>
        {selectedRows.map((row) => (
          <div key={row.id}>
            <p>姓名:{row.firstName} {row.lastName}</p>
            <p>年龄:{row.age}</p>
          </div>
        ))}
      </div>
    </>
  );
}

方法2:手动根据ID筛选行数据

如果不想引入apiRef,可以利用选中的ID数组,从原数据源中过滤出对应的完整行。

代码示例:

import { DataGrid, GridSelectionModel } from '@mui/x-data-grid';
import { useState } from 'react';

// 定义行数据类型
type Row = {
  id: number;
  firstName: string;
  lastName: string;
  age: number;
};

export default function YourComponent() {
  const rows: Row[] = data; // 你的数据源
  const [selection, setSelection] = useState<GridSelectionModel>([]);

  // 根据选中的ID筛选完整行数据
  const selectedRows = rows.filter(row => selection.includes(row.id));

  const columns = [
    { field: "id", headerName: "ID", sortable: false, hide: true },
    { field: "firstName", headerName: "First Name" },
    { field: "lastName", headerName: "Last Name" },
    { field: "age", headerName: "Age" }
  ];

  return (
    <>
      <div style={{ height: 400, width: "100%" }}>
        <DataGrid
          rows={rows}
          columns={columns}
          checkboxSelection
          getRowId={(row) => row.id}
          onSelectionModelChange={(newSelection) => {
            setSelection(newSelection);
          }}
        />
      </div>

      {/* 渲染选中行的完整数据 */}
      <div>
        {selectedRows.map((row) => (
          <div key={row.id}>
            <p>姓名:{row.firstName} {row.lastName}</p>
            <p>年龄:{row.age}</p>
          </div>
        ))}
      </div>
    </>
  );
}

方法对比

  • apiRef方法:效率更高,适合大数据量场景,无需手动遍历整个数据源;
  • 手动筛选方法:逻辑简单,不需要额外引入API对象,适合小数据量场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:15:57