React Material UI出现evaluating 'effect.next'报错如何解决
报错排查与修复方案
TypeError: undefined is not an object (evaluating 'effect.next')属于Material-UI Dialog组件过渡动画相关的内部队列执行异常,偶现触发的核心原因是Dialog被销毁时,内部未执行完的动画effect仍被调用,可按以下优先级排查修复:
- 调整Dialog显隐控制逻辑:禁止用条件渲染直接挂载/销毁Dialog组件,必须通过组件自带的
open属性控制显隐。
错误写法:{showFlag && <Dialog open={true} {...otherProps} />}
正确写法:<Dialog open={showFlag} {...otherProps} />
条件渲染会在变量切换为false时直接销毁组件实例,如果此时Dialog的关闭动画还在执行,内部未走完的effect队列就会触发该报错。 - 延迟执行销毁上下文的操作:如果关闭Dialog后需要立即跳转路由、销毁承载Dialog的上层组件,不要把逻辑直接写在
onClose回调中,要放到Dialog的TransitionProps.onExited回调中执行,等Dialog关闭动画完全结束、内部资源清理完成后再执行上下文销毁操作,示例代码:<Dialog open={openState} onClose={() => setOpenState(false)} TransitionProps={{ onExited: () => { // 此处放置路由跳转、上层组件状态修改等会销毁当前上下文的操作 } }} > {/* 对话框内容 */} </Dialog> - 清理Dialog内部的自定义异步逻辑:检查Dialog内部的
useEffect、定时器、接口请求、事件订阅等异步逻辑,必须在effect的清理函数中终止所有未完成的异步操作,避免组件销毁后异步回调执行访问已销毁的实例属性。 - 升级Material-UI版本:如果你当前使用的是v5.0.0~v5.8.2范围内的MUI版本,该版本区间存在Dialog过渡动画effect队列的已知偶现bug,升级到v5.10.0及以上的稳定版本即可直接修复该问题。
内容的提问来源于stack exchange,提问作者szilardban
相关产品推荐
相关产品推荐

