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 ...
随机推荐
- Linux Shell脚本编程--字符串截取
Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.aaa.com/123.htm. 1. # 号截取,删除左边字符,保留右边字符. echo ${var#*//} ...
- [Linux 004]——用户和用户组以及 Linux 权限管理(二)
到权限了.前面讲到了 Linux 中的用户和用户主管理,其实它们的本质(或者用户和用户组出现的初衷)都是方便权限管理.权限管理对于计算机的重要性不言而喻,权限让每个用户能够安安心心的使用计算机,而不用 ...
- 20145302张薇《Java程序设计》实验四报告
20145325张薇 实验四:Andoid开发基础 实验内容 使用 Android Studio 设计"Hello" 设计过程 首先创建项目 选择.xml中的`Design 选中W ...
- 20145333 《Java程序设计》第二次实验报告
2014333 <Java程序设计>第二次实验报告 课程:Java程序设计 指导教师:娄嘉鹏 实验日期:2016.04.12 实验名称:Java面向对象程序设计 实验内容 初步掌握单元测试 ...
- STC51六中中断配置点亮一个LED
一.外部中断0.1(分别點亮一個LED) /****************************************************************************** ...
- Eclipse安装zylin[转]
本文转载自:https://blog.csdn.net/dns888222/article/details/9263485 Eclipse安装zylin 在网上搜的是安装页为http://www.zy ...
- 转:web.xml 中的listener、 filter、servlet 加载顺序及其详解
在项目中总会遇到一些关于加载的优先级问题,刚刚就遇到了一个问题,由于项目中使用了quartz任务调度,quartz在web.xml中是使用listener进行监听的,使得在tomcat启动的时候能马上 ...
- hbase(二)hfile结构
HFile结构 截止hbase 1.0.2版本,hfile已经有3个版本,要深入了解hfile的话,还是要从第一个版本开始看起. hfile v1 Data Block:保存表中的数据,这部分可以被压 ...
- 解决node-sass安装不了的问题
1.下载https://github.com/sass/node-sass-binaries/blob/master/win32-x64-48_binding.node到E:\primeng\lib目 ...
- Devops 到底是什么?
Devops 到底是什么? 过去一年以来,一批来自欧美的.不墨守陈规的系统管理员和开发人员一直在谈论一个新概念:DevOps.DevOps就是开发(Development)和运维(Operations ...