You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在react-admin DataGrid中实现分组功能?

当然可以在react-admin的DataGrid组件中实现分组功能啦!其实react-admin里的DataGrid底层依托的是Material-UI的DataGrid组件,而MUI的DataGrid本身就支持行分组能力,咱们完全可以基于这个特性来做出你想要的分组效果~

具体实现步骤

1. 准备合适的依赖版本

如果想要完整的分组功能(比如拖拽列头分组、折叠/展开分组、自定义分组头),建议安装@mui/x-data-grid-pro(Pro版的DataGrid提供了更完善的分组能力),命令如下:

npm install @mui/x-data-grid-pro
# 或者用yarn
yarn add @mui/x-data-grid-pro

2. 在react-admin中引入Pro版DataGrid

react-admin默认导出的DataGrid是基于Community版的,所以要使用分组功能,咱们需要直接导入Pro版本的组件:

import { DataGridPro } from '@mui/x-data-grid-pro';
import { List, useListContext } from 'react-admin';

export const PostList = () => {
    const { data, total, isLoading } = useListContext();
    const rows = data ? data.map(row => ({ ...row, id: row.id })) : [];

    return (
        <List>
            <DataGridPro
                rows={rows}
                columns={columns}
                loading={isLoading}
                rowCount={total}
                // 设置默认分组字段,比如按category分组
                groupingModel={[{ field: 'category' }]}
            />
        </List>
    );
};

3. 配置可分组的列

在列配置中,给需要支持分组的字段加上groupable: true,这样用户还能手动拖拽列头来切换分组维度:

const columns = [
    { field: 'title', headerName: '文章标题', width: 250 },
    { field: 'category', headerName: '文章分类', width: 180, groupable: true },
    { field: 'author', headerName: '作者', width: 150, groupable: true },
    { field: 'publishDate', headerName: '发布日期', width: 180, type: 'date' },
];

4. 自定义分组头样式(可选)

如果想让分组行的显示更贴合你的业务需求,可以用renderGroupHeaderCell来自定义内容:

const renderGroupHeaderCell = (params) => {
    return (
        <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>
            <span>【{params.groupingField}】</span>
            <strong>{params.value}</strong>
            <span style={{ color: '#666' }}>共{params.children.length}条内容</span>
        </div>
    );
};

// 在DataGridPro中添加这个属性
<DataGridPro
    // ...其他属性
    renderGroupHeaderCell={renderGroupHeaderCell}
/>

5. 控制分组的展开/折叠状态(可选)

你还可以通过expandedRowGroups来控制默认展开哪些分组,或者监听展开状态的变化:

import { useState } from 'react';

export const PostList = () => {
    // 默认展开分类为"技术"的分组
    const [expandedGroups, setExpandedGroups] = useState(['category:技术']);
    const { data, total, isLoading } = useListContext();
    const rows = data ? data.map(row => ({ ...row, id: row.id })) : [];

    return (
        <List>
            <DataGridPro
                rows={rows}
                columns={columns}
                loading={isLoading}
                rowCount={total}
                groupingModel={[{ field: 'category' }]}
                expandedRowGroups={expandedGroups}
                onExpandedRowGroupsChange={(newGroups) => setExpandedGroups(newGroups)}
            />
        </List>
    );
};

如果暂时不想用Pro版,Community版的DataGrid没有原生分组能力,这时候得自己预处理数据(比如把同组数据合并,手动添加分组头行),但这种方式比较繁琐,不如Pro版省心高效。

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

火山引擎 最新活动