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

已安装MUI X Data Grid v6,但apiRef方法无法调用求助

MUI X Data Grid v6社区版apiRef方法无法调用的问题解决

问题核心

升级到@mui/x-data-grid v6.0.0社区版后,使用useGridApiRef获取的apiRef调用setPage等命令式方法时,触发Uncaught TypeError: apiRef.current.setPage is not a function错误,即使完全照搬官方文档示例代码也会出现该问题。

原因分析

这是MUI X v6的设计变更,并非项目自身问题,属于普遍现象:
当你通过paginationModel和onPaginationModelChange将分页状态交由外部React State手动控制时,Data Grid会禁用apiRef上对应的命令式分页方法(比如setPage、setPageSize)。因为此时分页状态完全由外部state管理,组件内部不再维护这部分状态,所以apiRef上不会挂载这些方法。

官方合规解决方案

根据你的业务需求选择以下两种方案:

方案1:让组件内部管理分页状态

如果不需要手动控制分页状态,移除paginationModel和onPaginationModelChange props,此时apiRef的命令式方法即可正常使用:

import * as React from 'react';
import Button from '@mui/material/Button';
import Stack from '@mui/material/Stack';
import Box from '@mui/material/Box';
import { DataGrid, useGridApiRef } from '@mui/x-data-grid';
import { useDemoData } from '@mui/x-data-grid-generator';

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

    const apiRef = useGridApiRef();

    const handleGoToPage1 = () => apiRef.current.setPage(1);

    return (
        <Stack spacing={1} sx={{ width: '100%' }} alignItems="flex-start">
            <Button onClick={handleGoToPage1}>Go to page 1</Button>
            <Box sx={{ height: 400, width: '100%' }}>
                <DataGrid
                    {...data}
                    apiRef={apiRef}
                    pagination
                    pageSize={10} // 仅设置默认页大小,不手动控制状态
                />
            </Box>
        </Stack>
    );
}

方案2:手动控制分页状态时,直接更新外部State

如果必须手动管理分页状态,直接修改paginationModel的state即可替代apiRef的命令式调用:

import * as React from 'react';
import Button from '@mui/material/Button';
import Stack from '@mui/material/Stack';
import Box from '@mui/material/Box';
import { DataGrid, useGridApiRef } from '@mui/x-data-grid';
import { useDemoData } from '@mui/x-data-grid-generator';

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

    const [paginationModel, setPaginationModel] = React.useState({
        page: 0,
        pageSize: 10,
    });

    // apiRef仍可用于其他不需要控制外部状态的方法,比如exportDataAsCsv
    const apiRef = useGridApiRef();

    // 直接更新paginationModel替代setPage调用
    const handleGoToPage1 = () => setPaginationModel(prev => ({
        ...prev,
        page: 1
    }));

    return (
        <Stack spacing={1} sx={{ width: '100%' }} alignItems="flex-start">
            <Button onClick={handleGoToPage1}>Go to page 1</Button>
            <Box sx={{ height: 400, width: '100%' }}>
                <DataGrid
                    {...data}
                    apiRef={apiRef}
                    pagination
                    paginationModel={paginationModel}
                    onPaginationModelChange={setPaginationModel}
                />
            </Box>
        </Stack>
    );
}

补充说明

对于exportDataAsCsv这类不依赖外部状态控制的apiRef方法,两种方案下都可以正常调用,不受上述变更影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:52:14