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

为何使用useState初始化MUI DataGrid的filterModel后筛选功能失效?

MUI DataGrid使用useState初始化filterModel时筛选失效问题

使用useState钩子初始化filterModel时,MUI DataGrid的筛选功能无法正常工作。注释第1行并启用第2行时筛选失效,反之则正常。

正常工作的代码

const filterModel = {items: [{columnField: 'descript', operatorValue: 'contains', value: descFilterModel}]};

//const [filterModel, setFilterModel] = useState({items: [{columnField: 'descript', operatorValue: 'contains', value: descFilterModel}]});
     
return (
  <DataGridPremium getRowId={(row) => row.qjobdefid}
    columns={columns}          
    filterModel={filterModel}          
    rows={rows}
    checkboxSelection={columns.length !== 0}
    disableSelectionOnClick
    loading={loading}
    rowHeight={48}
    scrollbarSize={10}
  />
)

筛选失效的代码

//const filterModel = {items: [{columnField: 'descript', operatorValue: 'contains', value: descFilterModel}]};

const [filterModel, setFilterModel] = useState({items: [{columnField: 'descript', operatorValue: 'contains', value: descFilterModel}]});
     
return (
  <DataGridPremium getRowId={(row) => row.qjobdefid}
    columns={columns}          
    filterModel={filterModel}          
    rows={rows}
    checkboxSelection={columns.length !== 0}
    disableSelectionOnClick
    loading={loading}
    rowHeight={48}
    scrollbarSize={10}
  />
)

效果对比

  • 正常效果:正常效果
  • 失效效果:失效效果

问题原因

useState的初始值仅在组件首次渲染时被设置一次,后续即使descFilterModel发生变化,filterModel的state也不会自动更新。而直接声明变量的方式,每次组件渲染都会重新计算filterModel的值,能同步descFilterModel的最新变化,因此筛选功能正常。

解决方案

通过useEffect监听descFilterModel的变化,手动更新filterModel的state,确保DataGrid始终拿到最新的筛选条件:

const [filterModel, setFilterModel] = useState({
  items: [{columnField: 'descript', operatorValue: 'contains', value: descFilterModel}]
});

// 监听descFilterModel变化,更新筛选模型
useEffect(() => {
  setFilterModel({
    items: [{columnField: 'descript', operatorValue: 'contains', value: descFilterModel}]
  });
}, [descFilterModel]); // 依赖项:当descFilterModel改变时触发

return (
  <DataGridPremium getRowId={(row) => row.qjobdefid}
    columns={columns}          
    filterModel={filterModel}          
    rows={rows}
    checkboxSelection={columns.length !== 0}
    disableSelectionOnClick
    loading={loading}
    rowHeight={48}
    scrollbarSize={10}
  />
)

这样每次descFilterModel更新时,filterModel的state会同步更新,DataGrid就能正确应用最新的筛选规则,恢复筛选功能。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:02:33