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

React MUI DataGrid fetch事件后动态显隐列不生效问题咨询

问题核心原因

你当前的写法属于直接原地修改columns变量的属性,没有通过React的状态更新机制触发重渲染,MUI的表格/数据网格组件检测不到列配置的变更,因此显隐配置不会生效。

解决步骤
  • 首先将columns声明为React的响应式状态,而非普通常量/外部变量
  • 修改列配置时必须生成全新的数组和列对象,不能直接修改原有引用,再调用状态setter更新
  • 确保MUI数据组件的columns属性绑定的是该响应式状态
代码示例
import { useState } from 'react';
import { DataGrid } from '@mui/x-data-grid';
// 其他依赖引入

// 抽离初始列配置
const initialColumns = [
  { field: 'id', headerName: 'ID', width: 90 },
  // 这里的hide默认值按你的业务需求设置,示例中第2列默认隐藏
  { field: 'targetCol', headerName: '目标列', width: 150, hide: true },
  // 剩余其他列配置
];

export default function YourComponent() {
  // 把columns设为响应式状态
  const [columns, setColumns] = useState(initialColumns);
  const [data, setData] = useState([]);

  const getData = () => {
    fetch(url + '/rha/apicall/getData/', {
      headers: { 
        'Content-Type': 'application/json',
        'Accept': 'application/json'
      }
    })
    .then(response => {
      enqueueSnackbar('Data Loaded', {variant: 'info'});
      return response.json();
    })
    .then(myJson => {
      // 生成全新的columns数组,仅修改指定列的配置
      const updatedColumns = columns.map((col, index) => {
        // 匹配你要修改的第2列(索引为1)
        if (index === 1) {
          return { ...col, hide: false };
        }
        return col;
      });
      // 更新列状态,触发重渲染
      setColumns(updatedColumns);
      setData(myJson.adh);
    });
  }

  return (
    <div style={{ height: 400, width: '100%' }}>
      <DataGrid
        rows={data}
        columns={columns}
        // 其他组件配置
      />
    </div>
  );
}
更推荐的MUI原生方案

MUI DataGrid原生提供了columnVisibilityModel属性用来控制列显隐,不需要修改columns数组,使用更便捷:

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

// 列配置不需要写hide属性
const columns = [
  { field: 'id', headerName: 'ID', width: 90 },
  { field: 'targetCol', headerName: '目标列', width: 150 },
  // 其他列配置
];

export default function YourComponent() {
  // 用可见性模型控制列显隐,key为列的field值,false为隐藏,true为显示
  const [columnVisibilityModel, setColumnVisibilityModel] = useState({
    targetCol: false // 初始隐藏目标列
  });
  const [data, setData] = useState([]);

  const getData = () => {
    fetch(/* 你的请求配置 */)
    .then(res => res.json())
    .then(myJson => {
      // 直接更新可见性模型,显示目标列
      setColumnVisibilityModel(prev => ({
        ...prev,
        targetCol: true
      }));
      setData(myJson.adh);
    });
  }

  return (
    <div style={{ height: 400, width: '100%' }}>
      <DataGrid
        rows={data}
        columns={columns}
        columnVisibilityModel={columnVisibilityModel}
        onColumnVisibilityModelChange={newModel => setColumnVisibilityModel(newModel)}
        // 其他配置
      />
    </div>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:36:01