深入掌握 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 相关文章推荐
javascript concat数组累加 示例
Sep 03 Javascript
Tips 带三角可关闭的文字提示
Oct 06 Javascript
JS操作图片(增,删,改) 例子
Apr 17 Javascript
一个js控制的导航菜单实例代码
Dec 03 Javascript
jQuery实现视频作为全屏幕背景
Dec 18 Javascript
Vue 过渡实现轮播图效果
Mar 27 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
Feb 05 Javascript
JavaScript实现简单的文本逐字打印效果示例
Apr 12 Javascript
vue使用rem实现 移动端屏幕适配
Sep 26 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
Aug 04 Javascript
微信小程序实现多行文字滚动
Nov 18 Javascript
一起来了解一下JavaScript的预编译(小结)
Mar 01 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
论建造顺序的重要性
2020/03/04 星际争霸
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
PHP引用(&amp;)各种使用方法实例详解
2014/03/20 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
C/S和B/S两种架构区别与优缺点分析
2014/10/23 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
jquery操作angularjs对象
2015/06/26 Javascript
深入浅析JS Function()构造函数
2016/08/22 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
js实现简单分页导航栏效果
2019/06/28 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
[02:11]2016国际邀请赛中国区预选赛全程回顾
2016/07/01 DOTA
Python内置函数—vars的具体使用方法
2017/12/04 Python
python 调用有道api接口的方法
2019/01/03 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
2021/01/09 Python
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
2014/11/09 面试题
三好学生演讲稿范文
2014/04/26 职场文书
村级四风对照检查材料
2014/08/24 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
三方协议书
2015/01/27 职场文书
python tqdm用法及实例详解
2021/06/16 Python