this.setState的注意事项

目录

 1、this.setState的注意事项

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

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

3.1  经过React包装的onClick点击事件()

3.2  没经过React包装的  原生点击事件


 1、this.setState的注意事项

this.setState(param1, param2);
        param1: 对象或函数 --- 改变state的值
        param2: 回调函数 --- 等待state更新后,执行的函数

项目中遇到类似这样的:

【问题】

        发现 if 语句里拿不到type的值

【原因】

        this.setState()不保证是同步的,所以在if条件中调用setState修改后的值,是做不到更新

的。

【解决】

        利用this.setState()的第二个参数:回调函数,在等第一个参数内的state更新后再调用

 【问题】

export default class A extends React.pureComponent {constructor(props){this.state={type: '',}}// 第一个参数:对象
onClick = () => {this.setState({type: 'asc'});if(this.state.type=== 'asc'){console.log(this.state.type, '0') // ''axios.post().then(res => {console.log(res, 'res')})}
};

 【解决】

// 第二个参数:回调函数,在等待第一个参数更新之后调用
onClick = () => {this.setState({ type: 'asc', // 第一个参数: 改变state}, () => {if(this.state.type=== 'asc'){  // 第二个参数:回调函数,用改变后的state值do somethingconsole.log(this.state.type, '0') // 'asc'axios.post().then(res => {console.log(res, 'res')})}});
};

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

React 的批处理更新导致的(batch the updates)

setState 其实本身执行的过程和代码都是同步的

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

                

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

由于isBatchingUpdates默认值是false,即默认是不批量更新的,是立即执行的,是同步的,一行执行完紧接着执行下一行。

但如果this.setState在React合成事件/钩子函数中,React会通过batchedUpdates()这个函数将isBatchingUpdates变成true,即批量更新的,不同步的。


        

所以主要看调用this.setState()的函数有没有被React包装过图中左侧是没有包装,右侧是经过React包装的如果没经过React包装(not managed by ReactJS), isBatchingUpdates就不会从false变为true,就是同步更新的,代码一行一行的执行

例子:

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

3.1  经过React包装的onClick点击事件()

       把这两次打印 console.log('prev state:', this.state.type)、console.log('current state:', this.state.type);  放到队列中,一起更新,所以第二次打印值与第一次打印值一样
  };

export default class A extends React.pureComponent {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);};render() {console.log('render3');return (<Button onClick={this.changeState}>改变state</Button>);}}

        打印结果:

        

       isBatchingUpdates是true,批量更新的,是不同步的,把要执行的内容放到队列中,一起更新,所以第二次打印值与第一次打印值一样

3.2  经过React包装的  原生点击事件

         把这两次打印 console.log('prev state:', this.state.type)、console.log('current state:', this.state.type); 分别打印 ,所以第二次打印值与第一次打印值不一样
  };

export default class A extends React.pureComponent {constructor(props) {super(props);this.state = {type: 'origin', // 原始值为 origin};}componentDidMount = e => {const dom = document.getElementById('btn');dom.addEventListener('click', this.changeState);
}changeState = e => {console.log('prev state:', this.state.type);this.setState({type: 'changed', // 改变后为 changed});console.log('current state:', this.state.type);};render() {console.log('render');return (<Button id="btn">改变state</Button>);}}

        打印结果:

        

isBatchingUpdates是false,说明是同步更新的,一行执行完紧接着执行下一行。
(在输出prev state 这一行之后,遇到第二行的this.setState()就立即执行了,state更新之后就触发了render,然后才输出current state)

这个博主:

http://t.csdnimg.cn/gEM7x

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

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

相关文章

嘘……快进来!这儿有最新版Microsoft照片程序的安装秘籍!(附安装引导程序下载)

网管小贾 / sysadm.cc 最近啊有不少小伙伴向我反馈&#xff0c;自个的 Windows 10 系统里边居然没有 Microsoft 照片 程序。 我觉得有点不可思议&#xff0c;为啥呢&#xff0c;因为他们的电脑是新买的&#xff01; 你看哈&#xff0c;系统是 22H2 最新版&#xff0c;安装日期…

vscode打开c_cpp_properties.json文件的一种方式

步骤一 点击win32 步骤二 点击json 自动生成了

鸿蒙Harmony-线性布局(Row/Column)详解

人生的下半场&#xff0c;做个简单的人&#xff0c;少与人纠缠&#xff0c;多看大自然&#xff0c;在路上见世界&#xff0c;在途中寻自己。往后余生唯愿开心健康&#xff0c;至于其他&#xff0c;随缘就好&#xff01; 目录 一&#xff0c;定义 二&#xff0c;基本概念 三&am…

如何使用“通义听悟”提高工作和学习效率

如何使用通义听悟提高工作和学习效率 通义听悟是一款利用人工智能技术&#xff0c;自动为音频和视频内容提供转写、翻译、总结、检索等功能的在线工具。它可以在会议、学习、访谈、培训等场景下&#xff0c;帮助您记录、阅读、整理、复习音视频信息&#xff0c;成为您的工作和…

FPGA 移位运算与乘法

题目&#xff1a; 已知d为一个8位数&#xff0c;请在每个时钟周期分别输出该数乘1/3/7/8,并输出一个信号通知此时刻输入的d有效&#xff08;d给出的信号的上升沿表示写入有效&#xff09; 由题意可知&#xff1a; 复位信号高有效&#xff0c;低复位&#xff1b;在inpu_grant上升…

WorkPlus卓越的即时通讯工具,助力企业提升工作效率

在当今快节奏的商业环境中&#xff0c;高效沟通和协作是企业成功的关键。而即时通讯作为实现高效沟通的利器&#xff0c;成为了现代企业不可或缺的一部分。作为一款领先的即时通讯工具&#xff0c;WorkPlus以其卓越的性能和独特的功能&#xff0c;助力企业打造高效沟通和协作的…

HTTP API 认证技术详解(二):Digest Access Authentication

目录 什么是 Digest Access Authentication 认证 Digest Access Authentication 认证的原理 Digest Access Authentication 认证的安全性 使用 Golang 实现 Digest Access Authentication 使用建议 小结 HTTP API 认证技术主要用于验证客户端身份&#xff0c;并确保只有经…

docker应用:搭建uptime-kuma监控站点

简介&#xff1a;Uptime Kuma是一个易于使用的自托管监控工具&#xff0c;它的界面干净简洁&#xff0c;部署和使用都非常方便。 历史攻略&#xff1a; docker&#xff1a;可视化工具portainer docker-compose&#xff1a;搭建自动化运维平台Spug 开源地址&#xff1a; ht…

【NI 国产替代】PXIe‑6378,16路AI(16位,3.5 MS/s/ch),4路AO,48路DIO,PXI多功能I/O模块

PXIe&#xff0c;16路AI&#xff08;16位&#xff0c;3.5 MS/s/ch&#xff09;&#xff0c;4路AO&#xff0c;48路DIO&#xff0c;PXI多功能I/O模块 PXIe‑6378是一款同步采样的多功能DAQ设备。 该模块提供了模拟 I/O、数字I/O、四个32位计数器和模拟和数字触发。 板载NI‑STC3…

class_3:lambda表达式

1、lambda表达式是c11引入的一种匿名函数的方式&#xff0c;它允许你在需要函数的地方内联的定义函数&#xff0c;而无需单独命名函数&#xff1b; #include <iostream>using namespace std;bool compare(int a,int b) {return a > b; }int getMax(int a,int b,bool (…

算法通关村第十六关—滑动窗口与堆结合(黄金)

滑动窗口与堆结合 堆与滑动窗口问题的结合 LeetCode239给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位&#xff0c;返回滑动窗口中的最大值。  对于最大值、K个最大这种场…

【Docker基础五】Dockerfile指令

Dockerfile 是一个文本文件&#xff0c;它包含了一系列的指令和参数&#xff0c;用来自动化构建 Docker 镜像的过程。每一个指令通常都会创建镜像的一层。下面是一些常用的 Dockerfile 指令。 1、FROM 语法&#xff1a;FROM <image>[:<tag>] [AS <name>]用…

大数据容器化

记录 知乎容器平台演进及与大数据融合实践 http://www.sykv.cn/cat/bigdata/4140.html Building online HBase cluster of Zhihu based on Kubernetes https://blog.csdn.net/mtj66/article/details/78803242

Golang 网络编程

TCP TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议 如何保证连接的可靠性&#xff1f; 三次握手四次挥手 三次握手 TCP 三次握手&#xff08;Three-way Handshake&#xff09;…

Spring MVC中的方法的返回值!!!

参考入门案例的工程代码&#xff1a;Spring MVC入门案例&#xff01;&#xff01;&#xff01;-CSDN博客 1.使用ModelAndView对象并返回 &#xff1a;这里我们在方法内部new了一个ModelAndView对象&#xff0c;通过这个对象&#xff0c;设置你想向jsp页面传达的信息。 modelA…

QT笔记 - 加载带有提升为自定义部件类的“.ui“文件 - 重写QUiLoader::createWidget()函数

说明 如果ui设计中有提升过小部件&#xff0c;则无法直接使用QUiLoader加载。完成加载需要重新实现UiLoader::createWidget()函数。 函数 virtual QWidget * QUiLoader::createWidget(const QString & className, QWidget * parent Q_NULLPTR, const QString & name…

RibbonGroup添加QCheckBox

RibbonGroup添加 QCheckBox&#xff1a; QCheckBox* pCheck new QCheckBox(tr("Check")); pCheck->setToolTip(tr("Check")); groupClipboard->addWidget(pCheck); connect(pCheck, SIGNAL(stateChanged(int)), this, SLOT(checkClick(int))); …

[学习笔记]刘知远团队大模型技术与交叉应用-汇总

参考资料&#xff1a; 视频&#xff1a;【清华NLP】刘知远团队大模型公开课全网首发&#xff5c;带你从入门到实战 课程计划 L1-NLP&Big Model Basics [学习笔记]刘知远团队大模型技术与交叉应用L1-NLP&Big Model Basics L2-Neural Network Basics [学习笔记]刘知…

微调深度学习模型:初级指南

引言 在深度学习领域&#xff0c;微调&#xff08;Fine-tuning&#xff09;是一种常见的实践&#xff0c;旨在优化预训练模型以适应特定任务或数据集。这对于那些希望利用已有模型来解决类似问题的初学者而言&#xff0c;是一个非常有用的技巧。 预训练模型的选择 微调开始于选…

计算机二级Python基本排序题-序号42(补充)

请在屏幕上输出以下杨辉三角形&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 a [] for i in range(8) :a.append([])for j in range(8) :a[i].append(0) for i in range(8) :a[i][0] 1a[i][i] 1 for i in range(2, 8) :f…