React解决setState异步带来的多次修改合一和修改后立即使用没有变化问题

我们编写这样一段代码

import React from "react"
export default class App extends React.Component {constructor(props){super(props);this.state = {cont: 0}}componentDidMount() {this.setState({cont: this.state.cont+1})}render(){return (<div>{ this.state.cont }</div>)}
}

我们在state中定义了一个cont 值是 0 然后 在componentDidMount 页面第一次渲染完成后执行的生命周期中 给他加一 然后我们运行代码
在这里插入图片描述
没错 一开始是0 页面第一次挂载完成 加一 变成了 1 是没问题的 然后我们将componentDidMount的代码改成这样
在这里插入图片描述
给他多加几次
在这里插入图片描述
但是 运行之后 我们会惊奇的发现 还是1
因为 setState 这个函数是个异步执行的 所以 相当于 他们接到的this.state.cont都是0 那0加一 自然就是 1了
所以 相当于 三次都给出了同样的值

那么 想解决这个问题 我们可以这样写

import React from "react"
export default class App extends React.Component {constructor(props){super(props);this.state = {cont: 0}}componentDidMount() {console.log("componentDidMount");this.setState((proState,props) => ({cont: proState.cont+1,}))this.setState((proState,props) => ({cont: proState.cont+1}))this.setState((proState,props) => ({cont: proState.cont+1}))}render(){return (<div>{ this.state.cont }</div>)}
}

setState直接去那上一次的值 做操作
最后 得到了 6 因为 componentDidMount 执行了两次 不过 至少验证了 我们这个方法解决了异步连续调用的问题
在这里插入图片描述
然后 就是另一个问题 我们 componentDidMount 的代码改成这样

componentDidMount() {this.setState({cont: this.state.cont+1})console.log(this.state.cont);
}

在这里插入图片描述
就还是那个问题 因为 setState是异步的 所以 你在这之后打印 肯定也拿不到最新的值

我们改成这样

componentDidMount() {this.setState({cont: this.state.cont+1}, () => {console.log(this.state.cont);})
}

在这里插入图片描述
setState其实提供了一个 修改完成后的回调
我们再回到中输出即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/5263.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端|CSS系列第2篇】CSS零基础入门之常用样式属性

欢迎来到CSS零基础入门系列的第二篇博客&#xff01;作为前端开发的关键技术之一&#xff0c;CSS&#xff08;层叠样式表&#xff09;能够为网页添加各种样式和布局效果。对于前端零基础的小白来说&#xff0c;了解和掌握CSS的常用样式属性是入门的关键。本篇博客将带你深入了解…

全志科技T507-H工业核心板规格书(4核ARM Cortex-A53,主频1.416GHz)

1 核心板简介 创龙科技SOM-TLT507是一款基于全志科技T507-H处理器设计的4核ARM Cortex-A53全国产工业核心板&#xff0c;主频高达1.416GHz。核心板CPU、ROM、RAM、电源、晶振等所有元器件均采用国产工业级方案&#xff0c;国产化率100%。 核心板通过邮票孔连接方式引出MIPI CS…

时间序列分解 | Matlab 互补集合经验模态分解(CEEMD)的信号分解

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列分解 | Matlab 互补集合经验模态分解(CEEMD)的信号分解 部分源码 %---------------------

TI AM64x工业核心板硬件说明书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)

1 硬件资源 创龙科技SOM-TL64x是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 单/四核Cortex-R5F 单核Cortex-M4F设计的多核工业级核心板&#xff0c;通过工业级B2B连接器引出5x TSN Ethernet、9x UART、2x CAN-FD、GPMC、PCIe/USB 3.1等接口。核心板经过专业的P…

记录好项目D20

记录好项目 你好呀&#xff0c;这里是我专门记录一下从某些地方收集起来的项目&#xff0c;对项目修改&#xff0c;进行添砖加瓦&#xff0c;变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是个springbootvue的图书管理系统项目 一、系统介绍 本项目前后端分离 …

代码源 线段树模板

线段树1 思路&#xff1a; 我们需要维护的东西是序列的最小值和最小值个数 这道题没有修改操作&#xff0c;因此不考虑修改 然后考虑Pushup 最小值很简单&#xff0c;直接取min 最小值个数怎么维护呢&#xff1f;考虑这个区间需要维护的值如何从左右两个区间获得 如果左右…

Scrpay框架之MongoDB--Index

目录 MongoDB-Index 概念 索引类型 创建索引 注意 样例 索引的查看 删除索引 语法 样例 检测索引的速度优势 Mongo-Unique Index And Compound Index 唯一索引&#xff08;Unique Index&#xff09; 添加唯一索引的语法 利用唯一索引进行数据去重 复合索引&a…

springboot增加logback日志记录ip

1、增加logback配置文件&#xff1a; public class IPLogConfig extends ClassicConverter {Overridepublic String convert(ILoggingEvent event) {RequestAttributes requestAttributes RequestContextHolder.getRequestAttributes();if (requestAttributes null) {return…

HTTP协议、存储、Ajax

HTTP协议、存储、Ajax 前端数据交互与HTTP协议 前后端通信 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>初识前后端通信</title></head><body><script>// 1.前后端通信…

SpringCloud-Nacos配置管理

文章目录 Nacos配置管理统一配置管理在nacos中添加配置文件从微服务拉取配置 配置热更新方式一方式二 配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置3&#xff09;运行两个UserApplication&#xff0c;使用不同的profile3&#xff09;运…

PHP函数、数组和错误处理:简单实用的开发技巧和错误处理方法

目录 PHP函数 函数的基本概念&#xff1a; 函数定义语法&#xff1a; 函数命名关系&#xff1a; 参数详解 形参 实参 ​编辑 默认值 引用传递 函数体 函数返回值 作用域 静态变量 可变函数 匿名函数 基本概念 闭包 伪类型 库函数 有关输出的函数 有关时间…

CentOS7 静默方式安装 Oracle19C

CentOS7 静默方式安装 Oracle19C 操作系统&#xff1a;CentOS7 Oracle&#xff1a; 19C 安装常用工具和依赖 yum -y install vim tar net-tools wget perl python3 readline* deltarpm python-deltarpm \zip unzip bc compat-libcap1* compat-libcap* binutils compat-libstdc…