深入掌握 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进行UTF-8编码的实现方法
Jun 27 Javascript
BootStrap无限级分类(无限极分类封装版)
Aug 26 Javascript
vuejs动态组件给子组件传递数据的方法详解
Sep 09 Javascript
jQuery Layer弹出层传值到父页面的实现代码
Aug 17 jQuery
Nginx 配置多站点vhost 的方法
Jan 07 Javascript
JavaScript递归函数解“汉诺塔”算法代码解析
Jul 05 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
May 09 Javascript
jquery+php后台实现省市区联动功能示例
May 23 jQuery
微信小程序 网络通信实现详解
Jul 23 Javascript
Node.js学习之内置模块fs用法示例
Jan 22 Javascript
vue商城中商品“筛选器”功能的实现代码
Jul 01 Javascript
Vue接口封装的完整步骤记录
May 14 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
15种PHP Encoder的比较
2007/04/17 PHP
php面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
php后退一页表单内容保存实现方法
2012/06/17 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
一个javascript参数的小问题
2008/03/02 Javascript
用javascript获取textarea中的光标位置
2008/05/06 Javascript
javascript 闭包疑问
2010/12/30 Javascript
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
Webpack打包字体font-awesome的方法示例
2018/04/26 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
小程序跨页面交互的作用与方法详解
2020/01/07 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
[27:02]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第三场
2014/05/24 DOTA
python实现百度关键词排名查询
2014/03/30 Python
Python 文件管理实例详解
2015/11/10 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
2018/04/18 Python
python3使用flask编写注册post接口的方法
2018/12/28 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
国际礼品店:GiftsnIdeas
2018/05/03 全球购物
先进事迹报告会主持词
2014/04/02 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
公司年夜饭通知
2015/04/25 职场文书
对领导班子的意见和建议
2015/06/08 职场文书
2016年优秀班主任先进事迹材料
2016/02/26 职场文书
古诗之爱国古诗5首
2019/09/20 职场文书
股东合作协议书模板2篇
2019/11/05 职场文书