如何解决部署时出现的Minified React error #185,无对应生命周期仍触发问题
错误触发原因
- 定时器未处理卸载场景:你定义的
ec2Ready定时器仅在接口返回ready: true时才会清除,如果组件在定时器运行期间卸载(比如用户跳转页面),定时器会持续运行并反复调用setState,满足触发条件时就会引发无限重渲染,触发185错误。 - setState写法错误:在
res.ready == false的分支中,你错误展开了整个prevState对象,相当于给所有state属性重新赋值,哪怕属性没有发生任何变化,会引发不必要的重渲染。如果接口持续返回ready: false,每8秒就会触发一次更新,累计超过React的重渲染次数限制就会抛出该错误。 - 潜在的事件绑定错误:如果表单提交事件写成了
onSubmit={this.handleFormSubmit()}(多了括号直接执行函数),会导致每次组件渲染时都触发提交逻辑,调用setState后再次触发渲染,形成无限循环。 - 语法隐患:你提供的constructor代码中state对象末尾缺少闭合的
},如果实际代码存在该问题,会导致state结构异常,触发不可预期的更新逻辑。
修复方案
1. 补充定时器卸载逻辑
首先在constructor中声明定时器引用,补全state的闭合括号:
constructor(props) { super(props); this.ec2Timer = null; // 新增定时器引用 this.state = { isLoggedIn: false, loading:false, username:"", password:"", message:"", alert:{ open: false, type: "", message: "" } }; // 补全state的闭合括号 this.handleClose = this.handleClose.bind(this); this.handleChange = this.handleChange.bind(this); this.handleFormSubmit = this.handleFormSubmit.bind(this); }
修改定时器赋值逻辑,同时新增componentWillUnmount生命周期清除定时器:
// handleFormSubmit中的定时器赋值修改 this.ec2Timer = setInterval(()=>{ this.Auth.checkStatus(this.state.username) .then((res)=>{ if(res.ready == true){ this.setState({loading:false, isLoggedIn:true}) clearInterval(this.ec2Timer) }else{ // 后续修改这里的setState逻辑 } }) }, 8000) // 新增卸载生命周期 componentWillUnmount() { if(this.ec2Timer) clearInterval(this.ec2Timer) }
2. 修正setState写法
React类组件的setState会自动合并第一层state属性,不需要展开整个prevState,仅更新需要修改的message字段即可:
// res.ready == false分支修改为 this.setState({ message: res.msg })
3. 检查事件绑定
确认表单提交事件是传入函数引用,没有直接执行:
<form onSubmit={this.handleFormSubmit}> {/* 表单内容 */} </form>
如果修改后问题仍存在,可以在开发环境下运行项目,非压缩版的React会输出完整错误栈,直接定位到触发循环更新的代码位置。
内容的提问来源于stack exchange,提问作者JHS67
相关产品推荐
相关产品推荐

