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

MUI X Data Grid v4自定义分页如何显示RowsPerPage配置项

问题原因

你直接替换了Data Grid的Pagination插槽,默认的分页插槽内置了每页行数选择器和页码控制两个模块,你自定义的CustomPagination组件只实现了页码控制逻辑,自然会丢失每页行数选择的功能。


解决方案1:替换PaginationItem插槽(推荐)

该方案无需改动整体分页结构,默认的每页行数选择、总数据量展示等功能都会保留,仅替换页码按钮的渲染样式,符合你要的Pagination组件效果。

import * as React from 'react';
import { DataGrid } from '@mui/x-data-grid';
import { useDemoData } from '@mui/x-data-grid-generator';
import PaginationItem from '@material-ui/lab/PaginationItem';

export default function CustomPaginationGrid() {
  const { data } = useDemoData({
    dataSet: 'Commodity',
    rowLength: 100,
    maxColumns: 6,
  });

  return (
    <div style={{ height: 400, width: '100%' }}>
      <DataGrid
        pagination
        pageSize={5}
        rowsPerPageOptions={[5, 10, 20]}
        // 仅替换页码项组件,不替换整个分页栏
        components={{
          PaginationItem: PaginationItem,
        }}
        // 传递PaginationItem的配置,比如主题色
        componentsProps={{
          paginationItem: {
            color: 'primary'
          }
        }}
        {...data}
      />
    </div>
  );
}

解决方案2:自定义Pagination组件时补全每页行数逻辑

如果你需要完全自定义整个分页栏的布局,可以在自定义组件内手动添加每页行数选择器,补上对应的控制逻辑:

import * as React from 'react';
import { makeStyles } from '@material-ui/styles';
import { DataGrid, useGridSlotComponentProps } from '@mui/x-data-grid';
import { useDemoData } from '@mui/x-data-grid-generator';
import Pagination from '@material-ui/lab/Pagination';
import FormControl from '@material-ui/core/FormControl';
import InputLabel from '@material-ui/core/InputLabel';
import Select from '@material-ui/core/Select';
import MenuItem from '@material-ui/core/MenuItem';

const useStyles = makeStyles({
  root: {
    display: 'flex',
    alignItems: 'center',
    gap: '16px',
    padding: '8px 0'
  },
});

function CustomPagination() {
  const { state, apiRef } = useGridSlotComponentProps();
  const classes = useStyles();
  // 从state里取当前页大小和配置的可选值
  const { pageSize, rowsPerPageOptions, pageCount, page } = state.pagination;

  const handlePageSizeChange = (e) => {
    apiRef.current.setPageSize(e.target.value);
  };

  return (
    <div className={classes.root}>
      {/* 自己实现每页行数选择器 */}
      <FormControl size="small" variant="outlined">
        <InputLabel id="rows-per-page-label">每页行数</InputLabel>
        <Select
          labelId="rows-per-page-label"
          value={pageSize}
          onChange={handlePageSizeChange}
          label="每页行数"
          style={{ minWidth: 120 }}
        >
          {rowsPerPageOptions.map(option => (
            <MenuItem key={option} value={option}>{option} 条/页</MenuItem>
          ))}
        </Select>
      </FormControl>

      <Pagination
        color="primary"
        count={pageCount}
        page={page + 1}
        onChange={(event, value) => apiRef.current.setPage(value - 1)}
      />
    </div>
  );
}

export default function CustomPaginationGrid() {
  const { data } = useDemoData({
    dataSet: 'Commodity',
    rowLength: 100,
    maxColumns: 6,
  });

  return (
    <div style={{ height: 400, width: '100%' }}>
      <DataGrid
        pagination
        pageSize={5}
        rowsPerPageOptions={[5, 10, 20]}
        components={{
          Pagination: CustomPagination,
        }}
        {...data}
      />
    </div>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:45:00