1. setState同步还是异步?

一般来说setState是异步的(能被react控制的function内),但是在setTimeOut和DOM原生事件addEventListener中是同步的。

  1. componentDidMount () {
  2. this.setState({ count: this.state.count + 1 })
  3. console.log(this.state.count) // 0
  4. this.setState({ count: this.state.count + 1 })
  5. console.log(this.state.count) // 0
  6. setTimeout(() => {
  7. this.setState({count: this.state.count + 1 })
  8. console.log(this.state.count) // 2
  9. }, 0)
  10. setTimeout(() => {
  11. this.setState({count: this.state.count + 1 })
  12. console.log(this.state.count) // 3
  13. }, 0)
  14. // setTimeout(function () {
  15. // this.setState({count: this.state.count + 1 })
  16. // console.log(this.state.count) // 报错,this 指向问题
  17. // }, 0)
  18. // 下面的setState是同步的
  19. document.body.addEventListener('click', () => {
  20. const count = this.state.count + 1
  21. this.setState({ count })
  22. console.log(this.state.count)
  23. })
  24. }

2.React中的异步组件

  1. // 引入需要异步加载的组件
  2. const LazyComponent = React.lazy(() => import('./lazyDemo') )
  3. // 使用异步组件,异步组件加载中时,显示fallback中的内容
  4. <React.Suspense fallback={<div>异步组件加载中</div>}>
  5. <LazyComponent />
  6. </React.Suspense>