如何判断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
相关产品推荐
相关产品推荐

