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

MUI Data Grid特定列无法更新:异步取数后值不显示

问题原因解析

核心原因是MUI Data Grid的单元格值缓存机制,结合你的状态更新顺序共同导致:

  • 初始渲染阶段:主数据objects先被存入状态,Data Grid基于该数据完成首次渲染,但此时A、B列表还未请求完成,状态为空数组。valueGetter调用getNameById时找不到对应ID,返回空值或undefined,对应单元格显示空白。
  • 异步请求完成后:A、B状态更新触发组件重渲染,但Data Grid的行数据(objects)未发生变化,它会默认缓存之前计算的单元格值,不会重新执行valueGetter读取新的A、B数据,因此空白状态被保留。
  • fetchedAll条件渲染生效的原因:当所有请求完成后才渲染Data Grid,此时A、B已持有完整数据,valueGetter第一次计算就能拿到正确名称,所以单元格正常显示内容。

如果不想用条件渲染,也可以通过两种方式解决:

  • 方式一:当A、B数据更新时,更新主数据objects的引用,触发Data Grid重新计算所有单元格值:
    const handleAFetched = (newA) => {
      setA(newA);
      // 通过扩展运算符创建新数组,触发objects引用更新
      setObjects(prev => [...prev]);
    };
    
  • 方式二:将A、B列表作为列配置的依赖,用useCallback包裹列定义,确保A、B变化时列配置更新,触发Data Grid重新计算:
    const columns = useCallback([
      { field: 'fieldA', valueGetter: (params) => getNameById(params.row.fieldA, A) },
      { field: 'fieldB', valueGetter: (params) => getNameById(params.row.fieldB, B) },
      // 其他列配置...
    ], [A, B]);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:30:01