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

Material UI Grid:如何将嵌套字段作为GridColDef的field使用?

Material UI Grid 渲染嵌套JSON数据的解决方案

问题场景

我需要在Material UI Grid中渲染嵌套结构的JSON响应数据,但Grid的GridColDef的field参数仅支持字符串,尝试使用点语法area.name无法生效。目前已通过将数据映射为扁平对象的方式实现,但希望找到无需提前转换数据的方案。

相关代码示例

列定义代码

const columns: GridColDef[] = [
    { field: `area.name`, headerName: 'AREA', minWidth: 120 },
    { field: 'costCenter', headerName: 'C. COSTO', minWidth: 120, flex: 4 },
    {
      field: '_',
      minWidth: 140,
      headerName: 'ACCIONES',
      align: 'center',
      headerAlign: 'center',
      renderCell: (params: GridRenderCellParams) => (
        <Tooltip title='Eliminar' placement='top' enterDelay={1000} leaveDelay={0} arrow>
          <i className='tabler-trash text-red-500 text-[20px]' />
        </Tooltip>
      )
    }
  ]

API响应示例

{
  "businessType": "GIRAS VENTAS",
  "area": [
    {
      "area": {
        "code": "G",
        "name": "GIRAS"
      },
      "costCenter": "15-05"
    },
    {
      "area": {
        "code": "E",
        "name": "EUROPA"
      },
      "costCenter": "17-07"
    }
  ]
}

当前使用的映射方案(不满意)

setFormattedData(data.area.map(e => {return {name: e.area.name, code: e.area.code, costCenter: e.costCenter}}))

无需提前映射数据的解决方案

Material UI Grid提供了两个直接处理嵌套数据的方式,无需提前转换整个数据集:

1. 使用valueGetter属性

在列定义中通过valueGetter直接从嵌套对象中提取值,替代field的点语法:

const columns: GridColDef[] = [
    { 
      headerName: 'AREA', 
      minWidth: 120,
      // 自定义valueGetter获取嵌套数据
      valueGetter: (params) => params.row.area.name
    },
    { field: 'costCenter', headerName: 'C. COSTO', minWidth: 120, flex: 4 },
    {
      field: '_',
      minWidth: 140,
      headerName: 'ACCIONES',
      align: 'center',
      headerAlign: 'center',
      renderCell: (params: GridRenderCellParams) => (
        <Tooltip title='Eliminar' placement='top' enterDelay={1000} leaveDelay={0} arrow>
          <i className='tabler-trash text-red-500 text-[20px]' />
        </Tooltip>
      )
    }
  ]

2. 使用renderCell自定义渲染单元格

如果需要对嵌套数据做额外处理,也可以直接在renderCell中读取嵌套字段:

const columns: GridColDef[] = [
    { 
      headerName: 'AREA', 
      minWidth: 120,
      renderCell: (params) => <span>{params.row.area.name}</span>
    },
    { field: 'costCenter', headerName: 'C. COSTO', minWidth: 120, flex: 4 },
    {
      field: '_',
      minWidth: 140,
      headerName: 'ACCIONES',
      align: 'center',
      headerAlign: 'center',
      renderCell: (params: GridRenderCellParams) => (
        <Tooltip title='Eliminar' placement='top' enterDelay={1000} leaveDelay={0} arrow>
          <i className='tabler-trash text-red-500 text-[20px]' />
        </Tooltip>
      )
    }
  ]

这两种方案都可以直接使用原始的嵌套数据,无需提前映射为扁平对象,更符合需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 20:57:39