状态不立即更新 ReactJS
State Not Updating Immediately ReactJS
我不知道我做错了什么。我有一个事件触发一个函数来改变几个值的状态,这样我就可以触发一个 API 调用;然而,第一次函数 运行s 状态没有改变。第二次函数 运行 设置了与前一个 运行 相比的状态变化。是什么导致了这种延迟?
正如您在下面看到的那样,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>
);
}
});
setState 不必调用两次。阅读你的代码我无法推断出到底出了什么问题,但我可以建议:
- Console.log 你在 render 函数中的状态,如果你想知道里面有什么。
- 再检查一下你的事件是什么(触发了什么情况,是否真的触发了)。
3.Check 如果另一个函数(另一个 setState)没有覆盖您要在 handlefilterChange 中设置的状态。
我敢打赌你的过滤器没有收到正确的值,首先收到未定义的 filter.detail.filterSelected 然后另一个已定义...
检查 filter.detail.filterSelected 中的内容 我在评论中看到你只检查了 filter.detail.filterType
无论如何,你的问题不是因为 setState,而是根据你的数据,我很确定。
如果有帮助请告诉我
setState
是异步的,因此更改不会立即反映在状态中:
setState() does not immediately mutate this.state but creates a
pending state transition. Accessing this.state after calling this
method can potentially return the existing value.
如果您需要确认状态或根据状态变化执行逻辑,请使用描述的回调参数here。
我不知道我做错了什么。我有一个事件触发一个函数来改变几个值的状态,这样我就可以触发一个 API 调用;然而,第一次函数 运行s 状态没有改变。第二次函数 运行 设置了与前一个 运行 相比的状态变化。是什么导致了这种延迟?
正如您在下面看到的那样,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>
);
}
});
setState 不必调用两次。阅读你的代码我无法推断出到底出了什么问题,但我可以建议:
- Console.log 你在 render 函数中的状态,如果你想知道里面有什么。
- 再检查一下你的事件是什么(触发了什么情况,是否真的触发了)。 3.Check 如果另一个函数(另一个 setState)没有覆盖您要在 handlefilterChange 中设置的状态。
我敢打赌你的过滤器没有收到正确的值,首先收到未定义的 filter.detail.filterSelected 然后另一个已定义... 检查 filter.detail.filterSelected 中的内容 我在评论中看到你只检查了 filter.detail.filterType
无论如何,你的问题不是因为 setState,而是根据你的数据,我很确定。
如果有帮助请告诉我
setState
是异步的,因此更改不会立即反映在状态中:
setState() does not immediately mutate this.state but creates a pending state transition. Accessing this.state after calling this method can potentially return the existing value.
如果您需要确认状态或根据状态变化执行逻辑,请使用描述的回调参数here。