使用 Material UI 的 Data Grid - Scrolling 功能

class Scrolling

Material UI 是一个强大的 React 组件库,它提供了许多用于构建现代用户界面的组件。在 Material UI 中,Data Grid 是处理数据表格的理想选择,尤其是在需要大量数据展示的场景下。本文将详细介绍 Data Grid 的滚动功能,包括其属性、方法及与其他组件的结合使用,并提供丰富的示例代码。

1. 安装 Material UI 和 Data Grid

在开始之前,你需要安装 Material UI 和 Data Grid。你可以通过以下命令进行安装:

npm install @mui/material @mui/x-data-grid

确保你的项目已经安装了 @mui/icons-material,以便使用图标。

npm install @mui/icons-material

2. Data Grid 基础用法

Data Grid 是一个功能强大的组件,支持行和列的定义、排序、筛选、分页等功能。以下是一个简单的 Data Grid 示例:

import React from 'react';
import { DataGrid } from '@mui/x-data-grid';

const columns = [
  { field: 'id', headerName: 'ID', width: 90 },
  { field: 'firstName', headerName: 'First name', width: 150 },
  { field: 'lastName', headerName: 'Last name', width: 150 },
  { field: 'age', headerName: 'Age', type: 'number', width: 110 },
  { field: 'fullName', headerName: 'Full name', 
    description: 'This column has a value getter',
    sortable: false,
    width: 160,
    valueGetter: (params) =>
      `${params.row.firstName || ''} ${params.row.lastName || ''}`,
  },
];

const rows = [
  { id: 1, lastName: 'Snow', firstName: 'Jon', age: 35 },
  { id: 2, lastName: 'Lannister', firstName: 'Cersei', age: 42 },
  { id: 3, lastName: 'Lannister', firstName: 'Jaime', age: 45 },
  { id: 4, lastName: 'Stark', firstName: 'Arya', age: 16 },
  { id: 5, lastName: 'Targaryen', firstName: 'Daenerys', age: null },
  { id: 6, lastName: 'Melisandre', firstName: null, age: 150 },
  { id: 7, lastName: 'Clifford', firstName: 'Ferrara', age: 44 },
  { id: 8, lastName: 'Frances', firstName: 'Rossini', age: 36 },
  { id: 9, lastName: 'Roxie', firstName: 'Harvey', age: 65 },
];

export default function DataTable() {
  return (
    <div style={{ height: 400, width: '100%' }}>
      <DataGrid rows={rows} columns={columns} pageSize={5} />
    </div>
  );
}

在上面的代码中,我们创建了一个简单的 Data Grid,展示了一些用户的基本信息。我们定义了 columnsrows,并设置了 pageSize 属性。

3. 滚动功能

Data Grid 支持水平和垂直滚动。以下是一个实现滚动的示例。在大型数据集的情况下,滚动功能可以极大提高用户体验。

3.1 垂直滚动

要实现垂直滚动,你只需设置 height 属性。例如:

<div style={{ height: 600, width: '100%' }}>
  <DataGrid rows={rows} columns={columns} pageSize={5} />
</div>

在这个例子中,我们将 Data Grid 的高度设置为 600 像素,以便在数据超过该高度时实现滚动。

3.2 水平滚动

要启用水平滚动,你需要定义列的宽度,确保它们的总宽度超过 Data Grid 的宽度。例如:

const columns = [
  { field: 'id', headerName: 'ID', width: 90 },
  { field: 'firstName', headerName: 'First name', width: 150 },
  { field: 'lastName', headerName: 'Last name', width: 150 },
  { field: 'age', headerName: 'Age', type: 'number', width: 110 },
  { field: 'fullName', headerName: 'Full name', width: 200 },
  { field: 'address', headerName: 'Address', width: 250 },
  { field: 'email', headerName: 'Email', width: 250 },
];

<div style={{ height: 400, width: '100%' }}>
  <DataGrid rows={rows} columns={columns} pageSize={5} />
</div>

在这个示例中,由于列的总宽度超过了 Data Grid 的宽度,用户可以水平滚动查看所有列。

4. 结合其他组件使用

4.1 结合筛选功能

我们可以将 Data Grid 和 Material UI 的筛选组件结合使用,以提升数据管理的灵活性。例如,使用 TextField 进行筛选:

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

const rows = [...]; // 同上

const DataTableWithFilter = () => {
  const [filterText, setFilterText] = useState('');

  const filteredRows = rows.filter((row) =>
    `${row.firstName} ${row.lastName}`
      .toLowerCase()
      .includes(filterText.toLowerCase())
  );

  return (
    <div style={{ height: 600, width: '100%' }}>
      <TextField
        label="Search"
        variant="outlined"
        onChange={(e) => setFilterText(e.target.value)}
      />
      <DataGrid rows={filteredRows} columns={columns} pageSize={5} />
    </div>
  );
};

在这个例子中,我们使用 TextField 组件作为搜索框,用户可以输入内容来实时筛选 Data Grid 中的数据。

4.2 结合分页功能

Data Grid 也支持分页,这在数据量大时非常有用。可以结合分页和滚动功能:

<DataGrid rows={filteredRows} columns={columns} pageSize={5} pagination />

pagination 属性设置为 true 可以启用分页功能,用户可以通过分页来浏览数据。

5. 属性和方法总结

5.1 主要属性

  • rows: 数据源,数组格式。
  • columns: 列定义,数组格式。
  • pageSize: 每页显示的行数。
  • pagination: 是否启用分页,布尔值。
  • autoHeight: 自动调整高度以适应行数,布尔值。
  • disableSelectionOnClick: 点击行时是否禁用选择,布尔值。
  • getRowId: 自定义行 ID 的方法。

5.2 主要方法

  • onSelectionModelChange: 行选择模型变化时触发的回调。
  • onPageChange: 页面变化时触发的回调。
  • onFilterModelChange: 过滤模型变化时触发的回调。

6. 完整示例

以下是一个结合滚动、筛选和分页的完整示例:

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

const columns = [/* same as above */];
const rows = [/* same as above */];

const CompleteDataGridExample = () => {
  const [filterText, setFilterText] = useState('');

  const filteredRows = rows.filter((row) =>
    `${row.firstName} ${row.lastName}`
      .toLowerCase()
      .includes(filterText.toLowerCase())
  );

  return (
    <div style={{ height: 600, width: '100%' }}>
      <TextField
        label="Search"
        variant="outlined"
        onChange={(e) => setFilterText(e.target.value)}
      />
      <DataGrid
        rows={filteredRows}
        columns={columns}
        pageSize={5}
        pagination
      />
    </div>
  );
};

export default CompleteDataGridExample;

结论

Material UI 的 Data Grid 提供了强大的数据展示和操作能力,特别是在需要处理大量数据时。通过结合滚动、筛选、分页等功能,可以极大地提升用户体验。希望本文能帮助你更好地理解和使用 Material UI 的 Data Grid。

chat评论区
评论列表
menu