您正在中调用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 }