深入掌握 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 相关文章推荐
Maps Javascript
Jan 22 Javascript
获取dom元素那些讨厌的位置封装代码
Jun 23 Javascript
js导出格式化的excel 实例方法
Jul 17 Javascript
iframe子页面获取父页面元素的方法
Nov 05 Javascript
JS可以控制样式的名称写法一览
Jan 16 Javascript
js获取指定的cookie的具体实现
Feb 20 Javascript
jquery查找父元素、子元素(个人经验总结)
Apr 09 Javascript
使用Promise链式调用解决多个异步回调的问题
Jan 15 Javascript
vue.js  父向子组件传参的实例代码
Oct 29 Javascript
js实现中文实时时钟
Jan 15 Javascript
JS中间件设计模式的深入探讨与实例分析
Apr 11 Javascript
JavaScript cookie原理及使用实例
May 08 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
yii实现级联下拉菜单的方法
2014/07/31 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
PHP strip_tags保留多个HTML标签的方法
2016/05/22 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
2017/07/27 PHP
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
JavaScript缓冲运动实现方法(2则示例)
2016/01/08 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
2016/06/22 Javascript
angularJS Provider、factory、service详解及实例代码
2016/09/21 Javascript
bootstrap fileinput完整实例分享
2016/11/08 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
2017/08/23 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
jquery 获取索引值在一定范围的列表方法
2018/01/25 jQuery
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
javascript实现多边形碰撞检测
2020/10/24 Javascript
浅谈python中set使用
2016/06/30 Python
Python使用pickle模块实现序列化功能示例
2018/07/13 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
Roots加拿大官网:加拿大休闲服饰品牌
2016/10/24 全球购物
波兰多品牌运动商店:StreetStyle24.pl
2020/09/22 全球购物
大学生求职简历的自我评价
2013/10/14 职场文书
人力资源部门的主要职能
2014/02/22 职场文书
优秀员工演讲稿
2014/05/19 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
党员个人党性分析材料
2014/12/18 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
python中的mysql数据库LIKE操作符详解
2021/07/01 MySQL
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL
Python学习之异常中的finally使用详解
2022/03/16 Python