我无法弄清楚我在这里做错了什么。我有一个事件触发一个函数来改变几个值的状态,这样我就可以启动一个API调用;但是,第一次运行该功能时状态不会改变。第二次运行该函数时,将设置上一次运行的状态更改。什么可能导致这种延迟?
因此,您可以在下面看到handleFilterChange
从事件中接收值,我可以验证是否正确接收了值;但是,如果我在设置后立即检查状态值,我可以看到它是未定义的。当事件第二次出现时;但是,我可以看到原来的状态变化现在已经发生,但第二个没有。那么为什么必须调用setState两次来实际设置状态呢?
var GridView = React.createClass({
getInitialState: function() {
window.addEventListener("scroll", this.handleScroll);
return {
data: [],
page: 0, //for pagination
loadingFlag: false,
};
},
getMainFeed: function() {
...
}, //end function
getFilteredItems: function() {
...
}, //end function
componentWillMount: function() {
},
listenForFilterChange: function() {
window.addEventListener("selectedFilterChange", this.handleFilterChange, false);
},
componentWillUnmount: function() {
window.removeEventListener("selectedFilterChange", this.handleFilterChange, false);
},
handleFilterChange: function(filter) {
//alert(filter.detail.filterType);
//Convert Data for getFilteredItems
//(EventType, Category, Buy, Inspiration) {
switch (filter.detail.filterType) {
//alert(filter.detail.filterType);
case 'category':
this.setState({
itemCategory: filter.detail.filterSelected,
});
break;
case 'event':
this.setState({
eventType: filter.detail.filterSelected,
});
break;
case 'type':
if (0){
this.setState({
filterBuy: 1,
filterInspiration: 0,
});
}
if (1){
this.setState({
filterBuy: 0,
filterInspiration: 1,
});
}
if (2){
this.setState({
filterBuy: 1,
filterInspiration: 1,
});
}
break;
case 'trending':
this.setState({
itemCategory: filter.detail.filterSelected,
});
break;
}
this.getFilteredItems();
},
componentDidMount: function() {
this.listenForFilterChange();
...
},
handleScroll:function(e){
...
},
componentDidUpdate: function() {
...
},
render: function() {
return (
<div id="feed-container-inner">
<GridMain data={this.state.data} />
</div>
);
}
});
答案 0 :(得分:2)
setState
是异步的,因此更改不会立即反映在状态中:
setState()不会立即改变this.state但会创建一个 待定状态转换。调用后访问this.state 方法可以返回现有值。
如果您需要根据状态更改确认状态或执行逻辑,请使用here所述的回调参数。
答案 1 :(得分:0)
不必调用setState两次。阅读你的代码我不能完全推断出错误,但我可以建议:
我敢打赌,你的过滤器没有收到正确的值,首先接收未定义的filter.detail.filterSelected然后定义另一个... 检查filter.detail.filterSelected中的内容我在您仅检查过filter.detail.filterType的注释中看到
无论如何,你的问题不是由于setState,而是来自你的数据,我很确定。
如果有帮助,请告诉我