您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么componentDidUpdate()创建一个无限循环?

为什么componentDidUpdate()创建一个无限循环?

您正在中调用ajax调用@H_404_1@componentDidUpdate,并在回调上设置了状态,这将触发另一个调用并进行更新,这将再次调用ajax请求,而回调将再次设置状态,依此类推。 您的条件@H_404_1@setData:

@H_404_1@if(this.state.data != data.data)

因为对象是引用类型并且无法比较,所以将始终返回true,无论从ajax调用返回的数据是什么,它始终是不同的对象,并会@H_404_1@true根据您的条件返回。例:

@H_404_1@var obj1 = {a:1}

var obj2 = {a:1}



console.log(obj1 != obj2); // returns true

您可以做的就是比较两个对象中的原始值。 例如:

@H_404_1@if(this.state.data.id != data.id) // id Could be a string or a number for example

我忘记提及的另一件事可能与您的问题没有直接关系,但应该强制执行, 在内部@H_404_1@componentWillMount或之内进行Ajax请求@H_404_1@constructor,因为在您的Ajax请求完成之前将调用render函数。您可以在DOCS中阅读有关它的信息。 应该在@H_404_1@componentDidMount 生命周期方法中调用Ajax请求。

另一件事可能会有所帮助,在@H_404_1@MonthToDate渲染函数中,您正在每个渲染器上传函数的新实例(这可能会导致性能下降)

@H_404_1@<select onChange={(event)=>this.groupBySelector(event)}>

尝试将其更改为此(事件将自动传递给处理程序):

@H_404_1@ <select onChange={this.groupBySelector}>

您还需要将其绑定到构造函数中:

@H_404_1@constructor(props){
    super(props);
    this.state = {
      data:null,
      url:"http://localhost:3000/api/monthtodate"
    }
    //console.log(this.props.location.state.token);

    this.groupBySelector = this.groupBySelector.bind(this); // binds this to the class
  }
其他 2022/1/1 18:18:38 有552人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶