我遇到了一个问题,我在componentDidMount
中通过执行AJAX调用来加载初始数据,并在所述AJAX调用的回调中设置状态。我也想立即操纵我的数据,所以我在setState
回调中调用另一个函数。以下是我的代码片段:
filterData(area) {
console.log(this);
console.log(this.state);
console.log(this.state.data);
... // The implementation of my filter
}
componentDidMount() {
let xhr = new XMLHttpRequest();
xhr.onloadend = () => {
console.log('* AJAX POST Response Received *');
if (xhr.status >= 200 && xhr.status < 400) {
this.setState({ data: JSON.parse(xhr.response) },
this.filterData(this.area)
);
} else {
console.error('[ERROR] Server returned invalid response');
}
};
}
当我查看this
对象中的状态时,我可以找到我期望的正确状态数据,但this.state
和this.state.data
是我设置的初始值构造函数。任何意见都将不胜感激。
所以我猜我在代码片段中遗漏了一些内容。我的过滤功能实际上调用this.setState
来将过滤后的数据存储在状态中。我认为这实际上是造成我问题的原因。
修订片段:
filterData(area) {
console.log(this);
console.log(this.state);
console.log(this.state.data);
... // The implementation of my filter
this.setState({ filtered_data: filtered });
}
我目前的解决方案:
filterData(area, all_data) {
if(this.state.data || all_data) {
... // The implementation of my filter
}
this.setState({ filtered_data: filtered });
}
componentDidMount() {
let xhr = new XMLHttpRequest();
xhr.onloadend = () => {
console.log('* AJAX POST Response Received *');
if (xhr.status >= 200 && xhr.status < 400) {
this.filterData(this.area, JSON.parse(xhr.response));
} else {
console.error('[ERROR] Server returned invalid response');
}
};
}
答案 0 :(得分:3)
setState
的第二个参数必须是函数。试试这个:
this.setState({
data: JSON.parse(xhr.response)
}, () => this.filterData(this.area));
答案 1 :(得分:0)
setState使得有能力重新渲染,就反应而言,在你无关紧要之后做任何你做的事情。您需要稍后进入组件生命周期,例如componentWillUpdate或componentDidUpdate来运行您的过滤器功能。