深入掌握 react的 setState的工作机制


Posted in Javascript onSeptember 27, 2017

react 是单向数据流,若想要改变已有组件的外观,我们只能通过更改组件的 props 或者更新组件的 state。在 react 项目的代码中我们操作最多的就是 this.setState 方法。下面对 setState 方法进行详细的说明。

<!--more -->

setState要点:react 框架为了提高性能,会对 state 的更新进行收集、合并、再进行一次批量的状态更新。这种机制常常导致一些意想不到的情况。

setState 有两种调用形式:

向 setState 传递对象
setState()并不会立即触发 state 的更新。

//this.state.demo = 1;
handleClick = () => {
  this.setState({demo: 2});
  console.log(this.state.demo);// 1
}

1、?注意:在 addEventListener、setTimeout、ajax 回调中 this.setState 是立即触发的。

2、setState 会合并更新,可能会造成状态更新的丢失

handleClick = () => {
  this.setState({demo: this.state.demo + 1});
  this.setState({demo: this.state.demo + 1});
}
//click 之后 demo 为2而不是3

综上:在同一代码块中不要多次调用 this.setState 方法

react 的 setState 还提供了另一种调用形式: this.setState(callbackFunc)

this.setState((previousState, currentProps) => {
  return { ...previousState, foo: currentProps.bar };
});

该语法和直接为 setState 传递对象不同,不会合并更新。

// demo + 1
handleSyncStateChange = () => {
  this.setState({
    demo: this.state.demo + 1
  });
  this.setState({
    demo: this.state.demo + 1
  });

}
// demo + 2
handleAsyncStateChange = () => {
  this.setState((preState, preProps) => {
    return {
      demo: preState.demo + 1
    }
  });
  this.setState((preState, preProps) => {
    return {
      demo: preState.demo + 1
    }
  });
}

refs

Async Nature Of setState

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
网上抓的一个特效
May 11 Javascript
JavaScript 异步调用框架 (Part 4 - 链式调用)
Aug 04 Javascript
一个简单的JavaScript数据缓存系统实现代码
Oct 24 Javascript
html超链接打开窗口大小的方法
Mar 05 Javascript
用jquery存取照片的具体实现方法
Jun 30 Javascript
让alert不出现弹窗的两种方法
May 18 Javascript
Js实现手机发送验证码时按钮延迟操作
Jun 20 Javascript
js实现简单的省市县三级联动效果实例
Feb 18 Javascript
javascript HTML5文件上传FileReader API
Mar 27 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
Jul 01 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
Dec 25 jQuery
Vue 去除路径中的#号
Apr 19 Javascript
JavaScript 保护变量不被随意修改的实现代码
Sep 27 #Javascript
JavaScript实现打印星型金字塔功能实例分析
Sep 27 #Javascript
微信小程序 按钮滑动的实现方法
Sep 27 #Javascript
详解Vue-cli代理解决跨域问题
Sep 27 #Javascript
jQuery 利用ztree实现树形表格的实例代码
Sep 27 #jQuery
javascript 作用于作用域链的详解
Sep 27 #Javascript
深入理解Vue2.x的虚拟DOM diff原理
Sep 27 #Javascript
You might like
PHP中Date获取时间不正确怎么办
2008/06/05 PHP
PHP实现图片的等比缩放和Logo水印功能示例
2017/05/04 PHP
PHP实现计算器小功能
2020/08/28 PHP
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
2009/11/04 Javascript
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
2013/06/24 Javascript
js获取域名的方法
2015/01/27 Javascript
jQuery实现折叠、展开的菜单组效果代码
2015/09/16 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
webpack写jquery插件的环境配置
2017/12/21 jQuery
angular的输入和输出的使用方法
2018/09/22 Javascript
[02:57]2014DOTA2国际邀请赛 选手辛苦解说更辛苦
2014/07/10 DOTA
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
使用graphics.py实现2048小游戏
2015/03/10 Python
Python中常见的数据类型小结
2015/08/29 Python
深入源码解析Python中的对象与类型
2015/12/11 Python
Python的装饰器使用详解
2017/06/26 Python
CentOS中升级Python版本的方法详解
2017/07/10 Python
使用Python实现简单的服务器功能
2017/08/25 Python
Python编程之gui程序实现简单文件浏览器代码
2017/12/08 Python
python微信跳一跳系列之棋子定位像素遍历
2018/02/26 Python
Django多数据库的实现过程详解
2019/08/01 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
2020/03/04 Python
keras中的History对象用法
2020/06/19 Python
Python QT组件库qtwidgets的使用
2020/11/02 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
Java servlet面试题
2012/03/04 面试题
汽车检测与维修个人求职信
2013/09/24 职场文书
护士自我介绍信
2014/01/13 职场文书
普通员工辞职信
2014/01/17 职场文书
前处理组长岗位职责
2014/03/01 职场文书
博士毕业生自我鉴定范文
2014/04/13 职场文书
法学自荐信
2014/06/20 职场文书
奖励申请报告范文
2015/05/15 职场文书
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python