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 中 ...
随机推荐
- list set map区别及适用场景
list与Set.Map区别及适用场景 1.List,Set都是继承自Collection接口,Map则不是 2.List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重 ...
- vue使用$http服务端收不到参数
老夫子我正在憋方案书,听到身后传来细软的声音:“李哥,我这有个Bug调了很长时间了,您能帮我看一下吗?”.说这话的是我的好朋友,公司新来的前端小妹伊万卡.我起身向她走去,看到因长时间调试Bug漂亮的脸 ...
- Python装饰器的另类用法
之前有比较系统介绍过Python的装饰器(请查阅<详解Python装饰器>),本文算是一个补充.今天我们一起探讨一下装饰器的另类用法. 语法回顾 开始之前我们再将Python装饰器的语法回 ...
- luogu准备复习(学习)题单
矩阵乘法 P1306 exbsgs P4195 网络流(割点) P1345 主席树 P3302
- 用shell统计表格数据
今天有个人问了这样一个问题,图片是原题,在这个题的基础上写了一个实现方法 首先日志存到a.txt文本里,如下 Zhangsan|lisi1|0|Zhangsan|lisi2|10|Zhangsan|l ...
- document.getElementById动态的Node集合随时变化, 和document.querySelector静态的后续无法变化
1. W3C 标准querySelectorAll 属于 W3C 中的 Selectors API 规范 [1].而 getElementsBy 系列则属于 W3C 的 DOM 规范 [2]. 2. ...
- hadoop之数据压缩与数据格式
* 注:本文原创,转载请注明出处,本人保留对未注明出处行为的责任追究. a.数据压缩 优点: 1.节省本地空间 2.节省带宽 缺点: 花时间 1.MR中允许进行数据压缩的地方有三个: 1)input起 ...
- SpringBoot+mybatis:报错Fri Oct 19 14:29:24 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requiremen
报错:Fri Oct 19 14:29:24 CST 2018 WARN: Establishing SSL connection without server's identity verifica ...
- js实现获取对象key名
使用for in遍历对象时,需要用hasOwnProperty(key)方法过滤掉非对象自身的属性(继承自原型链的属性) var obj = { "name" : "zh ...
- 人生苦短,我用python(目录)
一.python基础篇 python中闭包及延时绑定问题 python中的装饰器.生成器 二.前端 bootstrap框架 BOM&DOM JavaScript中的词法分析 三.数据库 mys ...