带有嵌套数据的材质 UI 数据网格

Lea*_*ver 2 javascript json reactjs material-ui react-data-grid

如何在反应材料 UI 数据网格上呈现嵌套的 JSON 数据。在附加的沙箱中,我想在数据网格上显示来自 json 的用户的电话号码 -嵌套 JSON 数据网格

Jan*_*ong 18

为了解决这个问题,让我们看看函数params中传递的对象valueGetter。记录下来,你会row在它下面找到一个物体。params.getValue()您应该访问该对象,而不是使用row。似乎params.getValue()只能用于一级 JSON 对象。这是输出字段的代码片段phone

  {
    field: "phone",
    headerName: "Phone",
    width: 160,
    valueGetter: (params) => {
      console.log({ params });
      let result = [];
      if (params.row.phone) {
        if (params.row.phone.home) {
          result.push("home: " + params.row.phone.home);
        }
        if (params.row.phone.office) {
          result.push("office: " + params.row.phone.office);
        }
      } else {
        result = ["Unknown"];
      }
      return result.join(", ");
    }
  }
Run Code Online (Sandbox Code Playgroud)

更新

为了更灵活地检查对象下的每个键是否存在,我创建了一个辅助方法:

const checkKeysUnderObject = (obj, result) => {
  for (let key in obj) {
    if (key) { // push the value to the result array only if key exists
      result.push(key + ": " + obj[key]);
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

辅助方法的用法:

if (params.row.phone) {
  checkKeysUnderObject(params.row.phone, result);
}else{
  result = ["Unknown"];
}
Run Code Online (Sandbox Code Playgroud)

我还在这里更新了codesandbox 。


Man*_*wat 8

这对我来说很好用

{ field: 'parserInfo', headerName: 'Parser Title', valueFormatter: ({ value }) => value.title }
Run Code Online (Sandbox Code Playgroud)


小智 6

我在我的项目中使用它:

{ 
    field: 'idMaintenancePlan',
    headerName: 'Plan de maintenance', 
    sortable: false, width: 200, 
    valueFormatter: (params) => params.row?.maintenancePlan?.name 
}
Run Code Online (Sandbox Code Playgroud)

  • 在新的 v5 版本中 - 这将不起作用。而是使用 valueGetter。 (3认同)
  • 这在 v5 中工作得很好,就像 valueGetter 一样 (2认同)
  • 考虑到我们从“valueFormatter”获得的值不用于过滤和排序,因此在大多数情况下使用“valueGetter”将是更好的解决方案。来自 [MUI 数据网格文档](https://mui.com/x/react-data-grid/column-definition/#value-formatter):生成的值仅用于渲染目的。过滤和排序不依赖于格式化值。使用 valueParser 支持过滤。 (2认同)

小智 6

这也很好用

{
     field: "family",
     headerName: "Family",
     width: 150,
     renderCell: (params) => {
       return <div className="rowitem">{params.row.family.name}</div>;
     },
},
Run Code Online (Sandbox Code Playgroud)