想要了解这个话题,只需要弄清楚下面三个问题,就明明白白了

1 this.setState()本身是同步的还是不同步的?

首先明确一点,setState 其实本身执行的过程和代码都是同步的

2 是什么造成了this.setState()的不同步?

React的批处理更新(batch the updates)。
React为了优化性能,setState()执行时会判断变量isBatchingUpdates的值是true or false, 然后决定是同步更新还是批量更新(从isBatchingUpdates这个变量名就可以直观的看出)
setState不同步原理

3 那this.setState()什么时候同步,什么时候不同步?

由于isBatchingUpdates默认值是false,即默认是不批量更新的,是立即执行的,是同步的。

但如果this.setState在React合成事件/钩子函数中,React会通过batchedUpdates()这个函数将isBatchingUpdates变成true,即批量更新的,不同步的。
在这里插入图片描述
所以主要看调用this.setState()的函数有没有被React包装过,如果没经过React包装(not managed by ReactJS), isBatchingUpdates就不会从false变为true,就是同步更新的(这是我自己白话总结的,大概这个意思,可能表达不是很准确=.=)

分别用两种方法绑定button的click事件,点击button的时候,改变state的值

改变state的方法是同样的, 封装为changeState:

constructor(props) {
    super(props);
    this.state = {
      type: 'origin', // 原始值为 origin
changeState = e => {
    console.log('prev state:', this.state.type);
    this.setState({
      type: 'changed', // 改变后为 changed
    });
    console.log('current state:', this.state.type);
a. 通过React合成事件onClick
render() {
	console.log('render');
    return (
      <Button onClick={this.changeState}>改变state</Button>

点击按钮,控制台打印结果:
在这里插入图片描述
说明不是同步更新的
(在输出 current state的地方,this.setState()并未执行,之后执行了才render)

b. 通过原生onclick事件
componentDidMount = e => {
    const dom = document.getElementById('btn');
    dom.addEventListener('click', this.changeState);
render() {
	console.log('render');
    return (
      <Button id="btn">改变state</Button>

控制台打印结果:
在这里插入图片描述
说明是同步更新的
(在输出prev state 之后,遇到this.setState()就立即执行了,state更新之后就触发了render,然后才输出current state)

觉得有用请点赞!
觉得有问题请留言~

这部分主要参考了这两篇文章:
setstate-state-mutation-operation-may-be-synchronous-in-reactjs
React中setState 什么时候是同步的,什么时候是异步的?

为什么各种文章里都是说this.setState()不同步,而不是直接说this.setState()异步?当然因为它不是异步的,只是一些情况下同步更新,一些情况下不同步更新this.setState为什么不同步更新?想要了解这个话题,只需要弄清楚下面三个问题,就明明白白了1 this.setState()本身是同步的还是不同步的?首先明确一点,setState 其实本身执行的过程和代码... 但是有时候我们会发现值的更新滞后,比如我们刚刚更新的name值,但是页面显示的还是以前的name,出现这种情况的原因就是 setState() 有时候是异步的 React 为了优化性能,有可能会将多个 setState() 调用合并为一次更新。 所以我们需要用到回调函数来...
this.setState是异步,所以在this.setState之后立即调用this.state是获取不到最新的数据的,那么怎么获取最新的数据呢?下面介绍三个方法: 1.回调函数callback this.setState({ val: this.state.val+1 }, () => { console.log(thi...
setState 不会立刻改变React组件中state的值. - setState 通过触发一次组件的更新来引发“重绘”. - 多次 setState 函数调用产生的效果会合并。 一、setState 为什么不会同步更新组件? 二、setState执行过程,流程图 分场景讨论 1.钩子函数和合成事件中 2.异步函数和原生事件中 3.componentDidMount调用setstate 4.componentWillUpdate componentDidUpdate 5.事件处理类型 6.传入的是函数
问题描述:经常会看到这样一个问题,明明已经调用setState的方法了,但是state的值不改变,或者是数据改变了,但是没有重新渲染。找到了几个解决办法,记录一下。思路一、可能是setState(value)中的value值的引用地址与state的一样 就比如最常用遇到的,对象或者数组的更新操作可能失败(最常遇到) 可能是这样的:** […b]这是一个新的数组,然后扩展b数组的元素到新数组,引用地址已经不一样了 所以总结:善用…扩展运算符思路二、可能调用这个set方法的onClick击事件,被父元素的
博主遇到了个问题 React组件的PureComponent中,antd的Select组件调用onSelect方法: this.setState({ selected: [1,2,3] }); 但是打印发现没有更新成功 原因是因为生命周期willrecivie又赋值了一次,导致值被覆盖了!!! 每次执行this.setState时render重新渲染,但是this.setState是异步更新的,在还render还没有再次渲染之前想要立即更新状态需要进行一定的操作: 方法一:实用回调函数,在回调函数中状态会立即更新 this.setState({ val: this.state.val+1 }, () =&gt; { console.log(this.state.val...
ReactNative内部分别使用了props, state来区分组件的属性和状态。props用来定义组件外部传进来的属性, 属于那种经过外部定义之后, 组件内部就无法改变。而state维持组件内部的状态更新和变化, 组件渲染出来后响应用户的一些操作,更新组件的一些状态。如果组件内部状态不需要更新,即没有调用过this.setState, 全部通过props来渲染也是没问题的, 不 代码如下: import React, { PureComponent, useState, useRef } from 'react' import { Mapbox, InnerMap } from './style' // import Example from './position' import { Map, Marker, Geolocation } from 'react-amap'; impor onRefusal(){ this.setState({showMask:true},()=>{this.setState({showMask:this.state.showMask})}) 在this.setState函数中增加一个箭头函数即可同步更新