React中this.setState是同步还是异步?为什么要设计成异步?
在使用react的时候,this.setState为什么是异步呢?
一直以来没有深思这个问题。昨天就此问题搜索了一下。
react创始人之一 Dan Abramov gaearon在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
- hs_err_pid
- django celery的分布式异步之路(二) 高并发
- django celery的分布式异步之路(一) 起步
- SpringMVC拦截器Interceptor
- 元宵快乐:看SQL大师们用SQL绘制的团圆
- Python Redis pipeline操作
- python concurrent.futures
- Deepmind的星际争霸2强化学习教程(1):建立环境与训练模型
- python contextlib 上下文管理器
- Django扩展自定义manage命令
- Elasticsearch分片、副本与路由(shard replica routing)
- EsRejectedExecutionException排错与线程池类型
- python重试(指数退避算法)
- 动手为王 | Oracle 数据库跨版本升级迁移实践
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android 删除指定包名的App实例代码
- 在Ubuntu20.04 LTS中配置Java开发环境
- Android 加载GIF图最佳实践方案
- Android编程之方向传感器用法示例
- Ubuntu20.04安装cuda10.1的步骤(图文教程)
- Android的WebView与H5前端JS代码交互的实例代码
- Android 图片缓存机制的深入理解
- Ubuntu18.04安装Nvidia显卡驱动教程(图文)
- Android控件Spinner的使用方法(1)
- 学习使用Material Design控件(四)Android实现标题栏自动缩放、放大效果
- Ubuntu 20.04 CUDA&cuDNN安装方法(图文教程)
- Android开发之基于DialogFragment创建对话框的方法示例
- Android图片压缩的实例详解
- Android编程之手机壁纸WallPaper设置方法示例
- 手把手教你在腾讯云上搭建hadoop3.x伪集群的方法