javascript - 自定义渲染单元格数据网格 Material UI 的自定义排序

标签 javascript css reactjs material-ui

我正在使用 Material UI V4 Data Grid React Js 应用程序中的组件。Data Grid组件需要rows ( list 类型)和 columns ( list 类型) Prop 。
这是一个行元素的示例:

const rows = [
  {
    id: 1,
    customerName: "Silvestr Irma",
    carModel: {
      name: "Centurion",
      color: "red"
    },
    location: {
      name: "Belgium",
      address: "avenue Verheyen 93"
    }
  },
];
这是列列表的示例:
const columns = [
    {
      field: "customerName",
      headerName: "Custom Name",
      flex: 1,
      minWidth: 200
    },
    {
      field: "carModel",
      headerName: "Car Model",
      flex: 1,
      minWidth: 200,
      renderCell: (params) => (
        <Typography variant="subtitle2" className={classes.bolderText}>
          {params.value.name}
        </Typography>
      )
    },
    {
      field: "location",
      headerName: "Location",
      flex: 1,
      minWidth: 300,
      renderCell: (params) => (
        <div>
          <Typography variant="subtitle2" className={classes.bolderText}>
            {params.value.name}
          </Typography>
          <Typography variant="subtitle2" className={classes.ligtherText}>
            {params.value.address}
          </Typography>
        </div>
      )
    }
  ];
如果我们对 Data Grid 进行排序基于客户名称列的组件,排序适用于升序和降序,如下图所示:
enter image description here
enter image description here
但是,排序不适用于具有 render cell 的列。字段(汽车型号和位置列),如下图所示:
enter image description here
enter image description here
enter image description here
enter image description here
那么我如何为具有 render cell 的列实现自定义排序 field ?
例如,汽车型号名称列(Centurion、Centaur 和 Buffalo)和位置名称列(比利时、德国和西类牙)。
这是完整代码https://codesandbox.io/s/stackoverflow-custom-sort-data-grid-material-ui-dp609

最佳答案

正如您可能已经猜到的那样,使用 renderCell ,您需要创建一个自定义函数 ( sortComparator ),以便 DataGrid 知道如何对列进行排序。在您的情况下,这种类型可能就足够了:

    {
      field: "location",
      headerName: "Location",
      flex: 1,
      minWidth: 300,
      renderCell: (params) => (
        <div>
          <Typography variant="subtitle2" className={classes.bolderText}>
            {params.value.name}
          </Typography>
          <Typography variant="subtitle2" className={classes.ligtherText}>
            {params.value.address}
          </Typography>
        </div>
      ),
      sortComparator: (v1, v2) => v1.name.localeCompare(v2.name)
    }
工作示例:https://codesandbox.io/s/stackoverflow-custom-sort-data-grid-material-ui-forked-2kw12?file=/src/App.jsx:416-1248

关于javascript - 自定义渲染单元格数据网格 Material UI 的自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70389559/

相关文章:

javascript - 根据下拉菜单更改注册表单?

javascript 适用于 jsfiddle 但不适用于我的浏览器

javascript - 为什么 React 说不要在 <option> 元素上设置 'selected' 属性?

javascript - Jquery 通过触发器更改方法不起作用

javascript - 数组插入 JavaScript

javascript - React Router v5 : history. push() 改变地址栏,但不改变页面

twitter-bootstrap - Twitter Bootstrap 响应式布局在 IE8 或更低版本中不起作用

reactjs - Meteor/React/React-Bootstrap 构建失败

javascript - Apollo React 为什么不能在 UseEffect 钩子(Hook)中查询

javascript - 用 typescript 转换 javascript 事件 this