React之setState()
我们知道,在react中更新单个组件下state中的数据可以用setState()函数来实现,并且可以通过两种传参方式:对象、函数。
另外从文档中我们也可以了解到react可以将多个setState() 调用合并成一个调用来提高性能。
那么,这些事如何实现的呢?下面就以图解的方式来解析一下。
一、测试代码

可以看到,当我们点击H1标签的时候,会执行tick方法,方法内容正如你所见。

测试结果:0--->2--->4--->6--->8
这是为什么呢?继续往下看。
二、多个setState()合并以提高性能
因为频繁地更新state中的数据会导致视图重新渲染,所以为了性能考虑,react会将你一个方法中的数据更新操作合并为一个,这一点和优化js操作style防止多次回流类似。
react会将一个函数中的所有setState()操作的对象合并,所以:

上述操作,由于都是对一个参数的重新赋值,所以,合并后只有最后一个赋值操作生效
counter: prevState.counter+,
这里的prevState稍后解释。下面对上述操作作一下修改①:

同理,由于操作合并,最终的数据更新情况是这样的:
counter: prevState.counter+,
msg:'桔子桑'

再次修改②:

由于合并,最后的数据更新情况是这样的:
counter:this.state.counter+,
msg:'桔子桑'

三、setState()都干了什么?
从上面我们知道,setState()并不会立马更新数据,而是把多次操作合并然后才作一次数据更新,那么,仅此而已?
这里就要说到将函数作为参数的第二种用法里prevState参数的由来了。
其实每次setState()都会将要更新的数据存到nextState变量中,我们用例子做示范:

所以,最终更新的数据是这样的:
counter:this.state.counter++,
msg:'桔子桑'
因此,点击按钮的话,counter=0+100+1=101,msg=‘桔子桑’


至此,react中的setState()就讲完了,你理解了么?
React之setState()的更多相关文章
- React的setState分析
前端框架层出不穷,不过万变不离其宗,就是从MVC过渡到MVVM.从数据映射到DOM,angular中用的是watcher对象,vue是观察者模式,react就是state了. React通过管理状态实 ...
- React中setState同步更新策略
setState 同步更新 我们在上文中提及,为了提高性能React将setState设置为批次更新,即是异步操作函数,并不能以顺序控制流的方式设置某些事件,我们也不能依赖于this.state来计算 ...
- 初学React,setState后获取到的thisstate没变,还是初始state?
问题:(javascript)初学React,setState后获取到的thisstate没变,还是初始state?描述: getInitialState(){ return {data:[]}; } ...
- React中setState学习总结
react中setState方法到底是异步还是同步,其实这个是分在什么条件下是异步或者同步. 1.先来回顾一下react组件中改变state的几种方式: import React, { Compone ...
- React的setState学习及应用
React的setState学习及应用 一:作用: setState() 将对组件 state 的更改排入队列,并通知 React 需要使用更新后的 state 重新渲染此组件及其子组件.这是用于更新 ...
- 「React Native笔记」在React的 setState 中操作数组和对象的多种方法(合集)
运用在React 中 setState的对象.数组的操作时是不能用类似array.push()等方法,因为push没有返回值,setState后会出现state变成Number,为了方便他人和自己查看 ...
- React中setState 什么时候是同步的,什么时候是异步的?
class Example extends React.Component { constructor() { super(); this.state = { val: 0 }; } componen ...
- React的setState如何实现同步处理数据
React里面的使用setState来进行状态的更新,为了性能的提升,此时的过程是异步操作的,那我们如果在一个进程里面想同步操作改变了状态的值怎么办呢,这里需要使用回调函数了: this.setSta ...
- [React] Safely setState on a Mounted React Component through the useEffect Hook
In the class version of this component, we had a method called safeSetState which would check whethe ...
随机推荐
- BeanFactory与ApplicationContext
本文总结自:https://www.cnblogs.com/xiaoxi/p/5846416.html 我们常说的Spring容器(即Spring Ioc 容器),是如何创建bean的? BeanFa ...
- 地址之间的复制,memcpy函数
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char a[3 ...
- 配置linux内核输出所有的log信息
答案:修改内核文件include/linux/printk.h (内核版本为4.9) 修改前 #define CONSOLE_LOGLEVEL_DEFAULT 7 /* anything MORE ...
- poj-2259 team queue(数据结构)
第一遍看的时候立即想到了哈希表. 再想时觉得两个队列,一个用来排队伍之间的顺序,一个用来排队伍内部成员的顺序即足够了. DEQUE的时候先判断哪只队伍排在队首,之后再让该队伍中的首队员出列. 整体没有 ...
- SaltStack高可用multi-master-第十三篇
multi-master官方介绍 As of Salt 0.16.0, the ability to connect minions to multiple masters has been made ...
- windows使用Pandoc将Markdown转换为PDF文件
pandoc下载:https://github.com/jgm/pandoc/releases/tag/1.19.2.1 //windows下载msi文件 miktex下载:https://mikte ...
- 【cs231n】反向传播笔记
前言 首先声明,以下内容绝大部分转自知乎智能单元,他们将官方学习笔记进行了很专业的翻译,在此我会直接copy他们翻译的笔记,有些地方会用红字写自己的笔记,本文只是作为自己的学习笔记.本文内容官网链接: ...
- apache解压版安装服务
解压版也就是绿色版 到apache/bin目录 然后运行下面命令 httpd.exe -k install -n "Apache24" 如果要卸载服务的话,就是下面这个命令 htt ...
- 源码安装git
1.安装依赖包 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel 2.下载git源码并解压缩 wget ...
- gTest&gMock learning
在C++中,编写服务后的一种测试方式是使用google的gTest和gMock结合 之前写py,测试方式是将服务挂起,使用工具模拟请求发包,check resp,这样的缺点在于不方便,即使存下了所有的 ...