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

修改Props后componentDidMount反复调用引发无限循环问题求助

解决React中componentDidMount无限循环的问题

嘿,我一眼就看出问题出在哪了——你的AppRoutes组件里定义路由页面的方式有问题!

你现在是用内联函数来创建每个路由对应的组件,比如:

const InformationFilterPage = () => <InformationFilter rootState={this.state} setRootState={this.setState.bind(this)}/>;

然后把这个函数传给Route的component属性。每次AppRoutes的state更新时(比如你在InformationFilter里调用setRootState),这个内联函数就会重新生成一个全新的组件引用。React会认为这是一个完全不同的组件,于是会把之前的InformationFilter卸载,再重新挂载一个新的实例。这就导致componentDidMount被反复触发,每次触发又更新父组件state,形成无限循环。

修复方案

你只需要调整路由的写法,把内联函数组件改成用Route的render属性传递props,这样就不会每次都创建新的组件实例了:

步骤1:优化AppRoutes的方法绑定(可选但推荐)

先在AppRoutes的构造函数里提前绑定setRootState,避免每次render都调用bind:

constructor(props) {
  super(props);
  this.state = {
    selectedIndustry: '',
    selectedJob: '',
    industries: [],
    jobs: [],
  };
  // 提前绑定方法,避免重复创建函数
  this.setRootState = this.setState.bind(this);
}

步骤2:修改路由定义

把原来的内联函数组件替换成render属性的写法:

render() {
  return (
    <HashRouter>
      <Switch>
        <Route exact path='/' component={Main}/>
        <Route path='/secondview' component={SecondView}/>
        {/* 用render属性传递props */}
        <Route path='/traineeships' render={() => <Traineeship rootState={this.state} setRootState={this.setRootState}/>}/>
        <Route path='/information-filter' render={() => <InformationFilter rootState={this.state} setRootState={this.setRootState}/>}/>
        <Route path='/information-job' render={() => <InformationJob rootState={this.state} setRootState={this.setRootState}/>}/>
        <Redirect from='*' to='/'/>
      </Switch>
    </HashRouter>
  );
}

这样修改后,当AppRoutes的state更新时,Route只会重新执行render回调里的函数,传递新的props给已经挂载的子组件,而不会卸载再重新挂载它们。InformationFilter的componentDidMount只会在第一次挂载时执行一次,再也不会触发无限循环了。

额外小提示

我还注意到你的InformationFilter组件里,jobs下拉框的渲染代码有个小错误:

{this.props.rootState.industries.map((job, i) => <option key={i} value={job.id}>{job.text}</option>)}

你这里用了industries数组来渲染job选项,应该改成jobs数组才对:

{this.props.rootState.jobs.map((job, i) => <option key={i} value={job.id}>{job.text}</option>)}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:48:40