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

MUI X Data Grid Pro动态列+固定列触发深度超限错误求助

解决MUI X Data Grid Pro固定列+动态列导致的“maximum depth reached”错误

核心原因

当固定列与动态生成列结合时,若每次渲染都重新创建完整的列数组,Data Grid会因列引用频繁变化触发重复重渲染,进而陷入渲染循环,抛出深度溢出错误。

解决方案

1. 用useMemo缓存完整列数组

将固定列与动态列的合并逻辑包裹在useMemo中,仅当动态列数据变化时才重新生成列数组,避免不必要的重渲染:

import { useMemo, useEffect, useState } from 'react';
import { DataGridPro } from '@mui/x-data-grid-pro';

function POGrid() {
  const [dynamicCols, setDynamicCols] = useState([]);

  // 从API获取动态列配置
  useEffect(() => {
    const getColumns = async () => {
      const response = await fetch('/api/get-dynamic-columns');
      const columns = await response.json();
      setDynamicCols(columns);
    };
    getColumns();
  }, []);

  // 缓存合并后的列数组
  const columns = useMemo(() => {
    // 固定列配置,保持引用稳定
    const fixedPOColumn = [
      {
        field: 'PONumber',
        headerName: 'PO编号',
        width: 160,
        fixed: 'left',
      },
    ];

    // 合并固定列与动态列
    return [...fixedPOColumn, ...dynamicCols];
  }, [dynamicCols]); // 仅依赖动态列数据

  return (
    <div style={{ height: 500, width: '100%' }}>
      <DataGridPro
        columns={columns}
        rows={/* 你的行数据 */}
        // 其他配置
      />
    </div>
  );
}

export default POGrid;

2. 稳定动态列中的回调函数

如果动态列包含自定义renderCell、filterCell等回调,需用useCallback缓存这些函数,避免因回调引用变化导致列配置频繁更新:

// 缓存自定义单元格渲染函数
const renderStatusCell = useCallback((params) => {
  return <span className={`status-${params.value}`}>{params.value}</span>;
}, []);

// 处理动态列,绑定缓存后的回调
const processedDynamicCols = useMemo(() => {
  return dynamicCols.map(col => {
    if (col.field === 'status') {
      return { ...col, renderCell: renderStatusCell };
    }
    return col;
  });
}, [dynamicCols, renderStatusCell]);

// 最终列数组
const columns = useMemo(() => {
  const fixedPOColumn = [{ /* 固定列配置 */ }];
  return [...fixedPOColumn, ...processedDynamicCols];
}, [processedDynamicCols]);

3. 排查循环更新逻辑

检查是否存在“列生成触发状态更新→状态更新重新生成列”的循环:

  • 避免在列配置的回调中直接修改组件状态
  • 确保API获取动态列的逻辑仅在组件挂载或特定条件下执行(如依赖数组为空)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 22:48:29