我一直在我的 ReactJS 项目中使用 async await 和 babel。我发现了 React setState 的一个方便用法,我只是想更好地理解它。考虑这个代码:
handleChange = (e) => {
this.setState({[e.target.name]: e.target.value})
console.log('synchronous code')
}
changeAndValidate = async (e) => {
await this.handleChange(e)
console.log('asynchronous validation code')
}
componentDidUpdate() {
console.log('updated component')
}
我的目的是让异步验证代码在组件更新后运行。它有效!结果控制台日志显示:
synchronous code
updated component
asynchronous validation code
只有在 handleChange 更新状态并呈现新状态后,验证代码才会运行。
通常要在状态更新后运行代码,您必须在 this.setState 之后使用回调。这意味着如果你想在 handleChange 之后运行任何东西,你必须给它一个回调参数,然后传递给 setState。不漂亮。但是在代码示例中,不知何故, await 在状态更新后知道 handleChange 已完成...但我认为 await 仅适用于Promise并在继续之前等待Promise解决。在 handleChange 中没有Promise也没有解决方案......它怎么知道要等待什么??
这意味着 setState 是异步运行的,而 await 以某种方式知道它何时完成。也许 setState 在内部使用了 Promise?
版本:
react:“^15.4.2”
babel 核心:“^6.26.0”
babel-preset-env: "^1.6.0",
babel-preset-react: "^6.24.1",
babel-preset-stage-0: "^6.24.1"
babel-plugin-system-import-transformer: "^3.1.0",
babel-plugin-transform-decorators-legacy: "^1.3.4",
babel-plugin-transform-runtime: "^6.23.0"