原因是
setState是异步
state的
setState,如果要使用
callback方法检查值,则不能紧随在之后的更新值。传递一个方法作为回调,该方法将在
setState完成其任务后执行。
为什么setState是异步的?
这是因为
setState更改
state并导致重新渲染。这可能是一项昂贵的操作,并且
synchronous可能会使浏览器无响应。因此,可以对
setState调用进行
asynchronous批处理,以提高UI体验和性能。
从 文档:
setState()不会立即使this.state突变,而是创建一个挂起的状态转换。调用此方法后访问this.state可能会返回现有值。无法保证对setState的调用的同步操作,并且可能为提高性能而对调用进行批处理。
将回调方法与setState一起使用:
要在
state之后检查更新后的值
setState,请使用如下回调方法:
setState({ key: value }, () => { console.log('updated state value', this.state.key)})检查一下:
class NightlifeTypes extends React.Component { constructor(props) { super(props); this.state = { barClubLounge: false, seeTheTown: true, eventsEntertainment: true, familyFriendlyOnly: false } } handleonChange = (event) => { // Arrow function binds `this` let value = event.target.checked; if(event.target.className == "barClubLounge") { this.setState({ barClubLounge: value}, () => { //here console.log(value); console.log(this.state.barClubLounge); //both will print same value }); } } render() { return ( <input className="barClubLounge" type='checkbox' onChange={this.handleOnChange} checked={this.state.barClubLounge}/> ) }}ReactDOM.render(<NightlifeTypes/>, document.getElementById('app'))<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script><div id='app'/>


