深入掌握 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 相关文章推荐
提高网站信任度的技巧
Oct 17 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
Nov 03 Javascript
图片旋转、鼠标滚轮缩放、镜像、切换图片js代码
Dec 13 Javascript
jquery实现文本框的禁用和启用
Dec 07 Javascript
js实现定时进度条完成后切换图片
Jan 04 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
Jan 11 Javascript
浅谈webpack打包过程中因为图片的路径导致的问题
Feb 21 Javascript
获取layer.open弹出层的返回值方法
Aug 20 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
Aug 31 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
Mar 12 Javascript
vue中封装axios并实现api接口的统一管理
Dec 25 Vue.js
vue 中 get / delete 传递数组参数方法
Mar 23 Vue.js
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
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
2019/10/10 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
javascript 写类方式之十
2009/07/05 Javascript
javascript CSS画图之基础篇
2009/07/29 Javascript
javascript真的不难-回顾一下基础知识
2013/01/15 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
2013/10/17 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
JavaScript中的比较操作符&gt;、=、
2014/12/31 Javascript
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
Angular排序实例详解
2017/06/28 Javascript
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
vue通过数据过滤实现表格合并
2020/11/30 Javascript
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
2016/07/01 Python
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
Python sqlalchemy时间戳及密码管理实现代码详解
2020/08/01 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
Html5移动端div固定到底部实现底部导航条的几种方式
2021/03/09 HTML / CSS
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
this关键字的作用
2016/01/30 面试题
资产评估专业大学生求职信
2013/09/29 职场文书
委托证明的格式
2014/01/10 职场文书
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
欢迎家长标语
2014/10/08 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
2015年12.4全国法制宣传日活动总结
2015/03/24 职场文书
表扬信范文
2015/05/04 职场文书
孝女彩金观后感
2015/06/10 职场文书
怒海潜将观后感
2015/06/11 职场文书
总经理年会致辞
2015/07/29 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书