我想不出我在做什麼錯在這裏。我有一個Event觸發一個函數來改變幾個值的狀態,這樣我就可以觸發一個API調用;然而,第一次運行的功能狀態不會改變。第二次函數運行時,將設置上一次運行的狀態更改。什麼可能造成這種延誤?狀態不立即更新ReactJS
因此,大家可以看到下面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>
);
}
});
謝謝@David。我沒有意識到這一點,現在這變得更有意義。 –