react的setState是异步还是同步

简介: react的setState是异步还是同步

文章目录


1. state 的更新可能是异步的

  1. 在合成事件和生命周期中是异步的,这里的异步指的是批量更新,达到性能优化的目的
  2. setTimeout,以及setState中是同步的

1. 1 异步

import {
  Component
} from 'react';
import './App.css';
class App extends Component {
  state = {
    count : 0
  }
  componentDidMount(){
    this.changeValue(1)
  }
  // setState 在合成事件和生命周期中是异步的, 这里的异步也叫批量更新,达到性能优化
  changeValue = (v)=>{
    this.setState({
      count: this.state.count + v
    })
    console.log("state=",this.state.count)
  }
  setCount = ()=>{
    this.changeValue(1)
  }
  render(){
    return (
    <div className="App">
      <h3>显示setState</h3>
      <button onClick={ this.setCount}> {this.state.count} </button>
    </div>
  );
  }
}
export default App;

  • 我们可以看到组件进来就显示1,但是打印区却打印了0, 说明在生命周期componentDidMount中是异步的,
  • 然后点击事件触发的加,显示的组件也每次比打印区的大,说明合成事件中setState也是异步的。

1.1 同步

import {
  Component
} from 'react';
import './App.css';
class App extends Component {
  state = {
    count : 0
  }
  componentDidMount(){
    this.changeValue(1)
    document.getElementById('test').addEventListener('click',()=>{
      this.setCount1(1)
    })
  }
  // setState 在合成事件和生命周期中是异步的, 这里的异步也叫批量更新,达到性能优化
  changeValue = (v)=>{
    this.setState({
      count: this.state.count + v
    })
    console.log("state=",this.state.count)
  }
  // 异步
  // setCount = ()=>{
  //   this.changeValue(1)
  // }
  // 同步
  setCount = ()=>{
    setTimeout(()=>{
      this.changeValue(1)
    },0)
  }
  // 原生事件调用
  setCount1 = ()=>{
    this.changeValue(1)
  }
  render(){
    return (
    <div className="App">
      <h3>显示setState</h3>
      <button onClick={ this.setCount}> {this.state.count} </button>
      <button id='test'>原生事件</button>
    </div>
  );
  }
}
export default App;

  • 可以看到,我们通过定时器或者原生js绑定事件监听的更新都是同步的

2. state的设置会被合并

import {
  Component
} from 'react';
import './App.css';
class App extends Component {
  state = {
    count : 0
  }
  componentDidMount(){
    this.changeValue(1)
  }
  // setState 在合成事件和生命周期中是异步的, 这里的异步也叫批量更新,达到性能优化
  changeValue = (v)=>{
    this.setState({
      count: this.state.count + v
    })
    console.log("state=",this.state.count)
  }
  setCount = ()=>{
    this.changeValue(1)
    this.changeValue(2)
  }
  render(){
    return (
    <div className="App">
      <h3>显示setState</h3>
      <button onClick={ this.setCount}> {this.state.count} </button>
    </div>
  );
  }
}
export default App;

  • 可以看到在异步的更新中,每次都是只加1, 但是我们的愿意是想要他加1之后加2的,那么如何实现我们的需求呢
  1. 可以使用setState的函数方法
  2. 使用定时器把异步转同步

2.1 使用setState的函数方法

import {
  Component
} from 'react';
import './App.css';
class App extends Component {
  state = {
    count : 0
  }
  componentDidMount(){
    this.changeValue(1)
  }
  // setState 在合成事件和生命周期中是异步的, 这里的异步也叫批量更新,达到性能优化
  changeValue = (v)=>{
    this.setState(state=>{
      return {
        count : state.count + v
      }
    })
    console.log("state=",this.state.count)
  }
  setCount = ()=>{
    this.changeValue(1)
    this.changeValue(2)
  }
  render(){
    return (
    <div className="App">
      <h3>显示setState</h3>
      <button onClick={ this.setCount}> {this.state.count} </button>
    </div>
  );
  }
}
export default App;

2.2 转同步

import {
  Component
} from 'react';
import './App.css';
class App extends Component {
  state = {
    count : 0
  }
  componentDidMount(){
    this.changeValue(1)
  }
  changeValue = (v)=>{
    this.setState({
      count: this.state.count + v
    })
    console.log("state=",this.state.count)
  }
  // 同步
  setCount = ()=>{
    setTimeout(()=>{
      this.changeValue(1)
      this.changeValue(2)
    },0)
  }
  render(){
    return (
    <div className="App">
      <h3>显示setState</h3>
      <button onClick={ this.setCount}> {this.state.count} </button>
    </div>
  );
  }
}
export default App;


react的状态更新可能是异步的,也可能是同步

相关文章
|
2月前
|
前端开发 JavaScript
学习react基础(3)_setState、state、jsx、使用ref的几种形式
本文探讨了React中this.setState和this.state的区别,以及React的核心概念,包括核心库的使用、JSX语法、类与函数组件的区别、事件处理和ref的使用。
68 3
学习react基础(3)_setState、state、jsx、使用ref的几种形式
|
3月前
|
资源调度 前端开发 API
React Suspense与Concurrent Mode:异步渲染的未来
React的Suspense与Concurrent Mode是16.8版后引入的功能,旨在改善用户体验与性能。Suspense组件作为异步边界,允许子组件在数据加载完成前显示占位符,结合React.lazy实现懒加载,优化资源调度。Concurrent Mode则通过并发渲染与智能调度提升应用响应性,支持时间分片和优先级调度,确保即使处理复杂任务时UI仍流畅。二者结合使用,能显著提高应用效率与交互体验,尤其适用于数据驱动的应用场景。
72 20
|
3月前
|
存储 前端开发 JavaScript
处理 React 应用程序中的异步数据加载
【8月更文挑战第31天】
60 0
|
4月前
|
存储 前端开发 安全
|
4月前
|
前端开发 JavaScript
react18【系列实用教程】useState —— 声明响应式变量(2024最新版)含useState 的异步更新机制,更新的合并,函数传参获取更新值,不同版本异步更新差异,更新对象和数组
react18【系列实用教程】useState —— 声明响应式变量(2024最新版)含useState 的异步更新机制,更新的合并,函数传参获取更新值,不同版本异步更新差异,更新对象和数组
245 0
|
5月前
|
前端开发
前端React篇之React setState 调用的原理、React setState 调用之后发生了什么?是同步还是异步?
前端React篇之React setState 调用的原理、React setState 调用之后发生了什么?是同步还是异步?
|
6月前
|
前端开发
说说React中setState和replaceState的区别?
在 React 中,setState()和 replaceState()是用于更新组件状态的两个方法。它们之间有一些区别
49 0
|
6月前
|
设计模式 前端开发 数据可视化
【第4期】一文了解React UI 组件库
【第4期】一文了解React UI 组件库
359 0
|
6月前
|
存储 前端开发 JavaScript
【第34期】一文学会React组件传值
【第34期】一文学会React组件传值
75 0
|
6月前
|
资源调度 前端开发 JavaScript
React 的antd-mobile 组件库,嵌套路由
React 的antd-mobile 组件库,嵌套路由
121 0