2 回答
![?](http://img1.sycdn.imooc.com/54584f8f00019fc002200220-100-100.jpg)
TA贡献1906条经验 获得超3个赞
setState() 并不总是立即更新组件。它可能会批量更新或推迟更新。这使得在调用 setState() 后立即读取 this.state 成为一个潜在的陷阱。相反,使用 componentDidUpdate 或 setState 回调 (setState(updater, callback))。
这样做以查看控制台更新状态:
toggle = () => {
const { dropdownOpen } = this.state;
this.setState({
dropdownOpen: !dropdownOpen,
}, () => console.log(this.state.dropdownOpen))
};
changeValueSecondary = (e) => {
this.setState(
{ dropDownValueNav: e.currentTarget.textContent },
() => console.log('state', this.state.dropDownValueNav)
);
console.log(e.currentTarget.textContent);
};
![?](http://img1.sycdn.imooc.com/545863e80001889e02200220-100-100.jpg)
TA贡献1874条经验 获得超12个赞
setState() 异步工作,因此出于性能目的,它将对状态的更新一起批处理。更多细节
为了克服这种竞争条件,有几种方法可以编写它。
您可以使用回调函数,您可以在其中调用 console.log() ,它将显示更新的选项。
您可以尝试使用 prevState 作为 setState() 的参数,并可以使用它来更新状态。
您还可以编写更新程序函数,您可以在回调中调用这些函数来更新状态。
所有选项的示例。
toggle = () => {
this.setState({
this.state.dropdownOpen: !this.state.dropdownOpen},
() => console.log(this.state.dropdownOpen)
)
};
changeValueSecondary = (e) => {
this.setState({
this.state.dropDownValueNav: e.currentTarget.textContent},
() => console.log(this.state.dropDownValueNav)
);
};
或者
toggle = () => {
this.setState((prevState) => ({
dropdownOpen: !prevState.dropdownOpen
}));
};
changeValueSecondary = (e) => {
this.setState({
this.state.dropDownValueNav: e.currentTarget.textContent},
() => doSomeThingWithTheUpdatedState();
);
};
doSomeThingWithTheUpdatedState = () => {
//Use the new value of the state.dropDownValueNav
}
同样对于高级应用程序,您可以使用要调用的减速器,它最终会在您使用它们之前更新状态。
添加回答
举报