首页 > 其他分享 >前端 | React setState 同步异步以及处理方式 | React

前端 | React setState 同步异步以及处理方式 | React

时间:2023-09-30 13:06:50浏览次数:43  
标签:异步 DOM 队列 React state setState

前端 | React setState 同步异步以及处理方式 | React

问题描述

在同步执行流程中setState表现为异步,而在异步执行流程中setState表现为同步。

示例:有一个控制DOM节点显隐的状态值,默认为false,而下一步就需要获取该DOM节点做一系类处理。所以一开始使用setState设置状态值为true,让该DOM节点显示。在正常情况下,下一步应该可以获取到该DOM节点,但实际结果却拿不到

由此可见,setState不是我们现象的那么简单。

内容分析

简单理解什么是队列?

队列属于常用的数据结构中的一种。其特点是:只允许在表的一端进行插入,表的另一端进行删除。所以只有最早进去的数据才会被最早删除,如果没有数据那就是个空队列。故队列又称为先进先出(FIFO—first in first out)线性表。

React会把多个setState()调用合并成一个调用。 这句话的意思是:程序碰到一个setState()就会把这个方法放入队列中,如果一下子出现了多个setState操作,会一起放入队列中,以最后一个为主。

在正常的方法或者生命周期函数中,setState表现为异步,如果是在延迟setTimeOut这类函数中,就会表现为同步。

注意[email protected]版本前后对setTimeOut这类原生函数表现有区别,具体可查询

解决方法

  • 直接传入一个函数
this.setState((state, props) => ({data: 111}))
  • 加入第二个参数,第二个参数是个回调函数,可以在这个回调函数中获取到刚刚更新得到的值,不过这个值实在 render 方法执行完毕之后才进行回调的
this.setState({data: 111},function(){
    console.log(this.state.data)
})
  • 使用 promise + asyce 进行封装
async function asyceSetState(state) {
  new Promise((resolve, reject) => {
    this.setState(state, () => { resolve() })
  })
}

await asyceSetState({data: 111})

结尾

setState实际上是使用了队列的方式,如果不对其进行处理,那就会呈现出异步的现象。

本期的内容就到这里,路过的小伙伴记得支持一下哦!

标签:异步,DOM,队列,React,state,setState
From: https://blog.51cto.com/appleex/7655730

相关文章

  • js:创建一个基于vite 的React项目
    相关文档Vite官方中文文档React中文文档ReactRouterRedux中文文档AntDesign5.0AwesomeReact创建vite+react项目pnpmcreatevitereact-app--templatereact#根据提示,执行命令cdreact-apppnpminstallpnpmrundev项目结构$tree-L1.├──README.md├──......
  • Java:Springboot和React中枚举值(数据字典)的使用
    目录1、开发中的需求2、实现效果3、后端代码4、前端代码5、接口数据6、完整代码7、参考文章1、开发中的需求开发和使用过程中,通常会涉及四个角色:数据库管理员、后端开发人员、前端开发人员、浏览者数据库使用int类型的数值进行存储(eg:0、1、2)Java代码使用enum枚举类型的对象进行......
  • Flutter/Dart第04天:Dart异步编程(Future和async/await)
    Dart官网代码实验室:https://dart.dev/codelabs/async-await重要说明:本博客基于Dart官网代码实验室,但并不是简单的对官网文章进行翻译,我会根据个人研发经验,在覆盖官网文章核心内容情况下,加入自己的一些扩展问题和问题演示和总结,包括名称解释、使用场景说明、代码样例覆盖、最后完......
  • React Native 动画(Animated)
    实现效果代码从react-native中引入import{Animated,Easing,}from'react-native';js实现constopacity1=useRef(newAnimated.Value(0.2)).current;constopacity2=useRef(newAnimated.Value(0.2)).current;constscale1=useRef(newAnimated.Valu......
  • 一文搞懂Java异步编程之FutureTask(转)
    背景Java异步编程的在实际开发中经常被用到,那么异步任务执行结束如何将结果通知到主线程或者其他任务呢?本文不探讨JUC包下的各类锁实现实现的任务同步或者通知。一、Thread狭隘的讲Java创建线程的方式只有一种,就是newThread实例。Thread本身是Runnable的实现并且它定义了Runna......
  • React-Native之Gradle下载慢的解决方案
    一、解决gradle下载慢的问题1.使用国内镜像   maven脚本如下:buildscript{repositories{maven{url'https://maven.aliyun.com/repository/gradle-plugin'}maven{url'https://maven.aliyun.com/repository/google'}maven......
  • uniapp自动引入Vue3(ref,reactive...)的API、uniapp生命周期和封装hooks
    未自动导入Vue3(ref,reactive...)的API和uniapp生命周期,需要在每个页面把API和uniapp生命周期的代码都重复写一遍<scriptsetup>import{ref,reactive}from"vue"import{onLaunch,onShow,onHide}from'@dcloudio/uni-app'//封装的hooksimport{useLi......
  • Vue3 - provide 提供的异步数据 inject 得到的数据 undefined 或 null
    如下所示,父组件(祖先组件)通过provide函数向所有后代组件传递prop。但是这两个Ref类型的数据最开始没有,需要等到onMounted初始化之后才有值。此时会遇到两个问题后代组件在setup函数中或者onBeforeMount等非常周期中调用,可能获取的是undefined或者null。传递响应式......
  • 异步执行延迟任务
        ......
  • C# BeginInvoke实现异步编程
    C#BeginInvoke实现异步编程-CSDN博客https://blog.csdn.net/Nire_Yeyu/article/details/133203267 C#BeginInvoke实现异步编程BeginInvoke实现异步编程的三种模式:1.等待模式在发起了异步方法以及做了一些其他处理之后,原始线程就中断并且等异步方法完成之后再继续;eg:usingS......