React中this.setState是同步还是异步?为什么要设计成异步?
在使用react的时候,this.setState为什么是异步呢?
一直以来没有深思这个问题。昨天就此问题搜索了一下。
react创始人之一 Dan Abramovgaearon在GitHub上回答了这一问题,以下是阅读后的一些总结吧
1.保持内部的一致性
即使state是同步更新,但是props也不是。props在重新渲染父组件之前,我们无法知道。眼下所提供的对象(state,props, refs)是内部一致性,这就意味着如果只使用这些对象,则可以保证它们引用完全协调的树。
当你只使用状态时,如果它是同步刷新,这种模式可以这样工作:
console.log(this.state.value) // 0
this.setState({value: this.state.value + 1});
console.log(this.state.value); // 1
this.setState({value: this.state.value + 1});
console.log(this.state.value); // 2
但是,如果这个状态被提升到父组件:
this.setState({value: this.state.value + 1});
this.props.onIncrement() // 在父组件身上做同样的事情。
在典型的react应用中,依赖this.setState()在父组件里是一种常见的特定于react的方式
console.log(this.props.value)// 0
this.props.onIncrement();
console.log(this.props.value)// 0
this.props.onIncrement();
console.log(this.props.value)// 0
这是因为,在上面这种状态下。this.state会立即刷新,但this.props不会。并且我们不能在this.props不重新渲染父级的情况下立即刷新,根据具体情况,这回非常显著的降低性能。
2.启用并发更新
Dan:我们一直在解释“异步呈现的一种方式“是react可以setState()根据它们的来源调用分配不同的优先级:时间处理程序,网络响应,动画等。
例如:如果要键入消息,setState()在TextBox需要立即刷新组件中的调用。但是,如果你在键入时收到新消息,则最好将新的渲染延迟到某个阈值(例如一秒),而不是因为阻塞线程而导致打字断断续续。
原文可看这里:https://github.com/facebook/react/issues/11527
React中this.setState是同步还是异步?为什么要设计成异步?的更多相关文章
- vue为什么要设计成异步队列渲染
异步队列渲染 上一篇文章是在vue2.0 中通过Object.defineProperty去拦截并监听数据变化的响应式原理,这篇文章将会沿着图谱继续深入探索,在依赖被通知变化了之后,会触发vue当中的 ...
- React学习小记--setState的同步与异步
react中,state不能直接修改,而是需要使用setState()来对state进行修改,那什么时候是同步而什么时候是异步呢? 基础代码: setCounter = (v) => { thi ...
- react中this.setState的理解
this.setState作用? 在react中要修改this.state要使用this.setState,因为this.state只是一个对象,单纯的修改state并不会触发ui更新.所以我们需要用 ...
- react中的setState的使用和深入理解
前端框架从MVC过渡到MVVM.从DOM操作到数据驱动,一直在不断的进步着,提升着, angular中用的是watcher对象,vue是观察者模式,react就是state了,他们各有各的特点,没有好 ...
- React中的setState到底发生了什么?
https://yq.aliyun.com/ziliao/301671 https://segmentfault.com/a/1190000014498196 https://blog.csdn.ne ...
- 3.React中的setstate的几个现象
转载segfault 上面的一篇文章,https://segmentfault.com/a/1190000014498196 1.在同一个方法中多次setState是会被合并的,并且对相同属性的设置只 ...
- react 中的 setState
语法:setState(newState [,callback]) 1.只要有入门基础的同学都知道 setState({...}) 是更新组件中的 state 内容 2.但是,setState 是异步 ...
- React中的setState(obj)
1.setState(obj) 只能浅merge obj,对于复杂对象结构的不行 比如: this.state = { data:{ idx:1 } } this.setState( ...
- 从源码的角度再看 React JS 中的 setState
在这一篇文章中,我们从源码的角度再次理解下 setState 的更新机制,供深入研究学习之用. 在上一篇手记「深入理解 React JS 中的 setState」中,我们简单地理解了 React 中 ...
随机推荐
- MongoDB 索引 explain 分析查询速度
一.索引基础索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更快.MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧.下面是创建索引 ...
- 关于 diff 和patch
参考: https://blog.csdn.net/zygblock/article/details/53384862 diff和patch是 版本控制 git 的不可缺少的工具 diff 是用来比较 ...
- 最近在写h5的页面,发现有一款框架还不错给大家推荐一下
wui 说一下自己写项目的体会吧,自我感觉wui还不错,能够让自己很快地把页面布局好,而且里面一些js效果也不用自己去手写jQuery代码很方便,下面让我们一起来认识一下wui这个框架吧 1,acco ...
- QSS 记录
1.border-style 属性分别有 none 定义无边框. hidden 与 "none" 相同.不过应用于表时除外,对于表,hidden 用于解决边框冲突. dotted ...
- C#操作SQLServer2012类
public class SqlServerService { public string CONN_STRING { get; set; } = "Data Source=.;Databa ...
- newcoder-最长树链-树/gcd
https://ac.nowcoder.com/acm/problem/13233 链接:https://ac.nowcoder.com/acm/problem/13233来源:牛客网 题目描述 树链 ...
- JDK7动态代理源码分析
IObject proxy = (IObject) Proxy.newProxyInstance(IObject.class.getClassLoader(), new Class[]{IObject ...
- Python3自定义日志类教程
一.说明 Python3的logging功能是比较丰富的支持不同层次的日志输出,但或是我们想在日志前输出时间.或是我们想要将日志输入到文件,我们还是想要自定义日志类. 之前自己也尝试写过但感觉文档太乱 ...
- day 03 数据类型
1.作业讲解 2.数据类型 什么是数据类型? (1)int 1,2,3用于计算. (2)bool:True,False,用户判断. (3)str:存储少量数据,进行操作 'fjdsal' '二哥',' ...
- ssh-keygen公钥进行免登
A服务器地址:192.168.1.200,下面简称A B服务器地址:192.168.1.201,下面简称B 1.在A生成密钥对ssh-keygen -t rsa -P ""1执行上 ...