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

如何判断MUI DataGrid的onStateChange并非处于加载状态?

MUI DataGrid 页面加载时 onStateChange 频繁触发的优化方案

MUI DataGrid 的 onStateChange 会在状态变更时触发,但页面加载阶段会触发6次以上,容易导致不必要的逻辑执行。你当前通过监听细分状态事件并配合 ref 标记加载完成的方式做了临时处理,这里提供几个更简洁的优化思路:

  • 通过 details.reason 过滤初始化触发
    onStateChange 以及各个细分状态事件的第二个参数 details 里,reason 属性会说明触发原因。页面加载阶段的触发通常带有 'initialState' 或 'hydration' 标识,直接过滤这些情况即可:

    const handleStateChange = (state, details) => {
      // 仅处理非初始化引发的状态变更
      if (!['initialState', 'hydration'].includes(details.reason)) {
        updatedProps.onStateChange?.(state, details);
      }
    };
    
    <DataGrid onStateChange={handleStateChange} {...updatedProps} />
    

    这种方式不用单独监听多个子事件,直接在 onStateChange 里过滤,代码更简洁。

  • 用 useEffect 延迟绑定业务逻辑
    借助 React 生命周期,等组件挂载完成后再处理状态变更事件,跳过初始化阶段的触发:

    const [isLoaded, setIsLoaded] = useState(false);
    
    useEffect(() => {
      setIsLoaded(true);
    }, []);
    
    const handleStateChange = (state, details) => {
      if (isLoaded) {
        updatedProps.onStateChange?.(state, details);
      }
    };
    
    <DataGrid onStateChange={handleStateChange} {...updatedProps} />
    
  • 抽离通用逻辑简化代码(针对你当前的方案)
    如果你还是想用细分事件的方式,可以把重复的逻辑抽成通用函数,减少冗余:

    const handleStateUpdate = (handler, model, details) => {
      refLoaded.current = true;
      handler?.(model, details);
    };
    
    <DataGrid
      onFilterModelChange={(model, details) => handleStateUpdate(updatedProps.onFilterModelChange, model, details)}
      onSortModelChange={(model, details) => handleStateUpdate(updatedProps.onSortModelChange, model, details)}
      onColumnVisibilityModelChange={(model, details) => handleStateUpdate(updatedProps.onColumnVisibilityModelChange, model, details)}
      {...updatedProps}
    />
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:37:41