深入掌握 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 相关文章推荐
Node.js抓取中文网页乱码问题和解决方法
Feb 10 Javascript
轻松实现Bootstrap图片轮播
Apr 20 Javascript
Vue.js学习笔记之 helloworld
Aug 14 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
Aug 23 Javascript
微信小程序 网络API Websocket详解
Nov 09 Javascript
JS常用算法实现代码
Nov 14 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
Feb 28 Javascript
详解VUE 数组更新
Dec 16 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
Oct 19 Javascript
详解Element-UI中上传的文件前端处理
Aug 07 Javascript
JS插入排序简单理解与实现方法分析
Nov 25 Javascript
js实现有趣的倒计时效果
Jan 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安全编程之加密功能
2006/10/09 PHP
php连接mysql数据库代码
2009/03/10 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
原生js做的手风琴效果的导航菜单
2013/11/08 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
jquery改变tr背景色的示例代码
2013/12/28 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
javascript伸缩菜单栏实现代码分享
2015/11/12 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
浅谈JavaScript 覆盖原型以及更改原型
2016/08/31 Javascript
基于jQuery实现的查看全文功能【实用】
2016/12/11 Javascript
react-native-fs实现文件下载、文本存储的示例代码
2017/09/22 Javascript
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
python实现博客文章爬虫示例
2014/02/26 Python
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
北卡罗来纳州豪华家具和家居装饰店:Carolina Rustica
2018/10/30 全球购物
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
.NET remoting的两种通道是什么
2016/05/31 面试题
Ajax请求总共有多少种Callback
2016/07/17 面试题
大学生社会实践活动总结
2014/07/03 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
2015年医院保卫科工作总结
2015/07/23 职场文书
2015年教师国培感言
2015/08/01 职场文书
高二语文教学反思
2016/02/16 职场文书