MUI Datatable customSearch报错:已返回布尔值仍提示需返回布尔值
问题原因与解决方案
核心问题:async函数返回的是Promise而非布尔值
你的customSearch是async函数,这类函数默认返回Promise对象,不是你定义的isFound布尔值。而MUI Datatable的customSearch要求同步返回布尔值,所以控制台会抛出“customSearch must return a boolean”的错误——它实际收到的是Promise,不是预期的布尔值。
为什么功能还能正常运行?
虽然返回值不符合组件要求,但你在函数内部直接调用setState更新了表格数据,所以界面能显示搜索结果,但组件的校验逻辑因为拿到非布尔值的返回结果,还是会报错。
解决方案:移除async/await,改用Promise链式调用
customSearch不支持异步返回值,你需要调整函数结构,不要用async声明:
修改后的代码示例
customSearch: (searchQuery) => { let isFound = false; if (searchQuery.length > 2 && enterPressed && enterLocked === false) { // 用Promise链式调用替代async/await apiFetch('GET', { endPoint: `patients/?name=${searchQuery}` }) .then(res => { const resultado = res.data; if (resultado.length !== 1) { resultado.forEach((dataRes, index) => { dataRes.sync = true; resultado[index] = dataRes; }); isFound = true; } this.setState({ data: parsePatientsList(resultado, literals.active), itemsLoaded: itemsLoaded + resultado.length, pagesLoaded: pagesLoaded + Math.floor(resultado.length / 10) + 1, patientList: [...patientList, ...resultado], // 原代码的...data是笔误,改为resultado enterPressed: false, enterLocked: true, }); }) .catch(err => { console.error('搜索请求失败:', err); }); // 同步返回布尔值,通过组件校验 return isFound; } return isFound; }
额外优化建议
MUI Datatable的customSearch设计初衷是本地数据过滤,而你的场景是调用接口获取新数据,更合理的做法是把搜索逻辑从customSearch中抽离:比如给搜索框绑定回车事件,触发接口请求后直接更新表格的data属性,这样完全避开组件的校验限制,逻辑也更清晰。
内容的提问来源于stack exchange,提问作者Juan Francisco Ruiz
相关产品推荐
相关产品推荐

