在使用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是同步还是异步?为什么要设计成异步?的更多相关文章

  1. vue为什么要设计成异步队列渲染

    异步队列渲染 上一篇文章是在vue2.0 中通过Object.defineProperty去拦截并监听数据变化的响应式原理,这篇文章将会沿着图谱继续深入探索,在依赖被通知变化了之后,会触发vue当中的 ...

  2. React学习小记--setState的同步与异步

    react中,state不能直接修改,而是需要使用setState()来对state进行修改,那什么时候是同步而什么时候是异步呢? 基础代码: setCounter = (v) => { thi ...

  3. react中this.setState的理解

    this.setState作用? 在react中要修改this.state要使用this.setState,因为this.state只是一个对象,单纯的修改state并不会触发ui更新.所以我们需要用 ...

  4. react中的setState的使用和深入理解

    前端框架从MVC过渡到MVVM.从DOM操作到数据驱动,一直在不断的进步着,提升着, angular中用的是watcher对象,vue是观察者模式,react就是state了,他们各有各的特点,没有好 ...

  5. React中的setState到底发生了什么?

    https://yq.aliyun.com/ziliao/301671 https://segmentfault.com/a/1190000014498196 https://blog.csdn.ne ...

  6. 3.React中的setstate的几个现象

    转载segfault 上面的一篇文章,https://segmentfault.com/a/1190000014498196 1.在同一个方法中多次setState是会被合并的,并且对相同属性的设置只 ...

  7. react 中的 setState

    语法:setState(newState [,callback]) 1.只要有入门基础的同学都知道 setState({...}) 是更新组件中的 state 内容 2.但是,setState 是异步 ...

  8. React中的setState(obj)

    1.setState(obj)  只能浅merge obj,对于复杂对象结构的不行 比如:  this.state = {   data:{  idx:1 }   }   this.setState( ...

  9. 从源码的角度再看 React JS 中的 setState

    在这一篇文章中,我们从源码的角度再次理解下 setState 的更新机制,供深入研究学习之用. 在上一篇手记「深入理解 React JS 中的 setState」中,我们简单地理解了 React 中 ...

随机推荐

  1. sed命令替换文件的内容【学习笔记】

    sed -i "s/line/Line/g" `grep "line" -rl /home//zhuangzebin/`

  2. vue-cli 最强指南

    今天在这篇文章里,会对 vue-cli 的功能做个详细的整理,把 vue-cli 所有的功能都列出来.注:这个是官网连接:https://cli.vuejs.org/zh/guide/ ,建议多看细看 ...

  3. 销售及SAP销售业务方案思维导图

    销售: SAP销售方案:

  4. echarts生成的图表大小怎么随屏幕的大小改变自适应

    最近在做图表,记录一下用到的知识点,当做自己的日记吧,会不断添加新内容 1,echarts生成的图表大小怎么随屏幕的大小改变自适应? this.chart.setOption(this.options ...

  5. idea Debug快捷键

    快捷键 介绍 F7 在 Debug 模式下,进入下一步,如果当前行断点是一个方法,则进入当前方法体内, 如果该方法体还有方法,则不会进入该内嵌的方法中 * F8 在 Debug 模式下,进入下一步,如 ...

  6. Jenkins之定时构建

    参考文章:https://blog.csdn.net/ZZY1078689276/article/details/77520441 第一个*表示分钟,取值0~59 第二个*表示小时,取值0~23 第三 ...

  7. js中关于数组处理的一些小技巧

    1 reduce方法同时实现map和filter 假设现在有一个数组,然后遍历它的每一项(map的功能)然后筛选出其中的一部分(filter的功能).如果使用map和filter的话,我们需要遍历这个 ...

  8. linux基础16-bash编程(case语句及脚本选项 )

    (1) case语句:选择结构 case SWITCH in value1) statement ... ;; //双分号结尾. value2) statement ... ;; *) stateme ...

  9. js实现bind方法

    //目标函数 function fun(...args) { console.log(this); console.log(args); } //目标函数原型对象上的一个方法cher func.pro ...

  10. Asp.net core 学习笔记 Razor Page

    更新 2019-04-27 最近做了更多的 research 发现微软视乎有意发展 razor page. razor page 的定位是 mvvm, 现在还有个叫 blazor 的东西, 类似用 c ...