深入掌握 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 相关文章推荐
服务器安全设置的几个注册表设置
Jul 28 Javascript
juqery 学习之五 文档处理 插入
Feb 11 Javascript
javascript定义变量时有var和没有var的区别探讨
Jul 21 Javascript
20条学习javascript的编程规范的建议
Nov 28 Javascript
JavaScript编程中window的location与history对象详解
Oct 26 Javascript
node.js入门实例helloworld详解
Dec 23 Javascript
浅谈JQuery+ajax+jsonp 跨域访问
Jun 25 Javascript
Sequelize中用group by进行分组聚合查询
Dec 12 Javascript
支持移动端原生js轮播图
Feb 16 Javascript
vue和webpack安装命令详解
Jun 15 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
Sep 06 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
Aug 14 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
Syphon 虹吸式咖啡壶冲煮–拨动法
2021/03/03 冲泡冲煮
PHP+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
php后台程序与Javascript的两种交互方式
2009/10/25 PHP
php中批量替换文件名的实现代码
2011/07/20 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
2014/06/23 PHP
PHP和MySql中32位和64位的整形范围是多少
2016/02/18 PHP
Bootstrap框架下下拉框select搜索功能
2020/03/26 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
2017/03/02 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
Javascript 实现 Excel 导入生成图表功能
2018/10/22 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
写了个监控nginx进程的Python脚本
2012/05/10 Python
通过Python爬虫代理IP快速增加博客阅读量
2016/12/14 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
对Python中一维向量和一维向量转置相乘的方法详解
2019/08/26 Python
django框架auth模块用法实例详解
2019/12/10 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
python爬虫工具例举说明
2020/11/30 Python
英国家用电器折扣网站:Electrical Discount UK
2018/09/17 全球购物
英国美术用品购物网站:Cass Art
2019/10/08 全球购物
vue项目实现分页效果
2021/03/24 Vue.js
实习生单位鉴定意见
2013/12/04 职场文书
党员领导干部廉洁从政承诺书
2014/03/27 职场文书
明确岗位职责
2015/02/14 职场文书
英文慰问信
2015/02/14 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
CSS Transition通过改变Height实现展开收起元素
2021/08/07 HTML / CSS
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers
Java Spring读取和存储详细操作
2022/08/05 Java/Android